#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;
Обратите внимание, что я также изменил псевдонимы таблиц, чтобы они были сокращениями для имен таблиц, а не произвольными буквами.