Использовать несколько критериев в SQL Server и возвращаемое значение

#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 с несколькими критериями? Как?

Желаемые результаты из Excel.

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

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 предложения внутри аналитической функции? «Это просто работает» — не самый полезный ответ, чтобы извлечь из него что-то полезное, особенно когда у вас не очень четкий вопрос и вы отвечаете на него самостоятельно.