Проблема с подзапросом при использовании WHERE во вторичном ВЫБОРЕ

#sql #sql-server #tsql

Вопрос:

У меня проблема с запросом.

 SELECT 
    a.code,
    b.codename,
    (SELECT COUNT(b.IdNum)
     FROM 
         (SELECT * 
          FROM NumTable
          WHERE YEAR(DateOfPoint) = 2019)) AS CountNumber
FROM 
    NumTable b
JOIN
    CodeTable a ON a.id = b.id
WHERE 
    a.SellYear IS NOT NULL
 

Мой первый вопрос касается количества, все ли в порядке ? Мне нужно посчитать только те b.IdNum, у которых дата точки = 2019. Это должно быть только в этом поле, а не в каком-либо другом в этом запросе, вот почему я не использовал его в конце концов в WHERE.
Второй вопрос тоже касается номера счета, потому что я все еще получаю сообщение об ошибке, что у меня неправильный синтаксис, я искал его около часа и не мог найти.

Спасибо

Комментарии:

1. Подзапрос, вероятно, должен быть коррелирован , т. е. включать ссылку на внешний запрос.

2. 2. Подзапросы в FROM нужных псевдонимах; у вас их нет. 1. Нет, ваш WHERE не поддается саргированию; используйте явные границы дат с >= и < .

3. 3. «b» означает «NumTable», «a» означает «кодируемый»? Не в моей азбуке. Используйте значимые псевдонимы. «N» (или «NT») означает «NumTable», «C» (или «CT») означает «Кодируемый».

Ответ №1:

не уверен, что вы пытаетесь получить здесь, но я думаю, что группироваться здесь более логично

 SELECT a.code
,b.codename
,Sum(case when b.DateOfPoint= 2019 then 1 else 0) as CountNumber
FROM NumTable b
JOIN CodeTable a ON a.id = b.id
WHERE a.SellYear IS NOT NULL
group by a.code,b.codename
 

вы получите строку для каждого кода и кодового имени, а также количество точек даты в 2019 году, которые у него есть, если их нет, он вернет 0

Комментарии:

1. Я использовал ваш код и немного изменил его «ВЫБЕРИТЕ a.код ,b.кодовое имя(случай, когда b.Дата точки= 2019, затем ПОДСЧИТАЙТЕ(b.IdNum) еще 0) в качестве номера СЧЕТА ИЗ NumTable b, ПРИСОЕДИНИТЕСЬ К кодовой таблице a НА a.id = b.id ГДЕ a.SellYear НЕ ЯВЛЯЕТСЯ НУЛЕВОЙ группой по a.коду,b.кодовому имени», И это сработало, я думаю, что все дело в этом, спасибо, что я должен использовать РЕГИСТР раньше.

Ответ №2:

Вы можете использовать этот запрос. Я думаю, это сработает для вас:

 SELECT a.code, 
    b.codename
    FROM
    NumTable b
    JOIN
    CodeTable a ON a.id = b.id
    JOIN
    (SELECT * 
              FROM NumTable
              WHERE YEAR(DateOfPoint) = 2019) c ON c.id = b.id
    JOIN
    (SELECT id, COUNT(b.IdNum) FROM c) d ON c.id = d.id
    WHERE 
        a.SellYear IS NOT NULL
 

Ответ №3:

Вы можете использовать оконную функцию:

 SELECT c.code, n.codename, c.cnt_2019
FROM (SELECT n.*,
             SUM(CASE WHEN YEAR(DateOfPoint) = 2019 THEN 1 ELSE 0 END) as cnt_2019
      FROM NumTable n
     ) n JOIN
     CodeTable c
     ON c.id = n.id
WHERE c.SellYear IS NOT NULL;
 

Обратите внимание, что я также изменил псевдонимы таблиц, чтобы они были сокращениями для имен таблиц, а не произвольными буквами.