#sql #sql-server
#sql #sql-server
Вопрос:
У меня есть следующие критерии, которые не будут выполняться.
Я пробовал:
SELECT
Main_ID AS [First_Custom_Column],
CASE
WHEN Column_1 = 'Y' AND
SUM(CASE WHEN Column_3 > 1 THEN Column_2 END) > 0 AND
COUNT(CASE WHEN Column_3 > 1 THEN 2 END) > 1 # Will fail, Error below.
THEN 1
ELSE 0
END AS [Second_Custom_Column]
FROM
[Table_Name]
WHERE
[Date] = '2020-11-01';
Ошибка: ‘Main_ID’ недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY
Затем я попробовал это:
SELECT
Main_ID AS [First_Custom_Column],
CASE
WHEN Column_1 = 'Y' AND
(CASE WHEN Column_3 > 1 THEN 1 END) > 0 AND
(CASE WHEN Column_3 > 1 THEN 2 END) > 1
THEN 1
ELSE 0
END AS [Second_Custom_Column]
FROM
[Table_Name]
WHERE
[Date] = '2020-11-01';
Ошибка: преобразование значения varchar ‘3344511715’ привело к переполнению столбца int.
По сути, я пытаюсь выполнить репликацию COUNTIF
и SUMIF
из Excel. После полной репликации я превращу запрос в функцию, но сначала мне нужно, чтобы он работал. Третий столбец, Column_3
, содержит дублированные данные, которые функция должна подсчитывать, чтобы увидеть, повторяются ли они.
Кто-нибудь успешно реплицировался COUNTIF
с несколькими критериями? Как?
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты.
2. Точно так же, как указано в ошибке, вам нужно добавить ‘group by main_id’ в конец. Есть ли проблема с этим?
3. Как написано,
COUNT()
будет пытаться пересчитать полный список строк. Если вам нужно подсчитать подмножество строк, вы должны попробоватьCOUNT() OVER()
.4. Что насчет вашей путаницы: каждый раз, когда вас смущает какая-то ошибка или вывод, вы должны представить себя СУБД, очистить весь контекст и значение данных (вы этого не знаете) и делать только то, что написано. СУБД не знает природу ваших данных или семантику или что-то, что вы можете получить, просто взглянув на это. Он делает то, что вы просите его сделать.
5. Обработка @Rookie по строкам — это плохой дизайн базы данных, и такое вычисление можно легко выполнить с помощью одного оператора. Поэтому было бы хорошо, если бы вы могли обновить свой вопрос и предоставить исходные данные, откуда вы хотите вызвать эту функцию, и связь между этими данными и справочным набором данных для вычисления чего-либо на нем.
Ответ №1:
Заставил это работать:
COUNT([Column_3]) OVER (PARTITION BY [Column_3] ORDER BY [Column_3]) AS [xCountIF],
SUM([Column_2]) OVER (PARTITION BY [Column_3] ORDER BY [Column_3]) AS [xSumIF]
Если у кого-то есть подобная проблема, ответьте на этот ответ, и я расскажу вам об этом.
Комментарии:
1. Пожалуйста, объясните это решение. Как это связано с
COUNT(CASE WHEN Column_3 > 1 THEN 2 END)
тем, что оно не содержит никаких обращений? Какова цельORDER BY
предложения внутри аналитической функции? «Это просто работает» — не самый полезный ответ, чтобы извлечь из него что-то полезное, особенно когда у вас не очень четкий вопрос и вы отвечаете на него самостоятельно.