ВЫБЕРИТЕ 2 ЗНАЧЕНИЯ с различными требованиями - PullRequest
0 голосов
/ 29 ноября 2018

Мне интересно, возможно ли выбрать 2 значения в одном операторе выбора, которые имеют разные критерии.Я знаю, что могу достичь выше с помощью подзапроса, просто интересно, есть ли более эффективный способ сделать это.

Рассмотрим следующую таблицу:

UserId | CreatedDate
1      | 2018-01-21
2      | 2018-02-21
3      | 2018-03-21
4      | 2018-11-21
5      | 2018-11-21

Я хочу выбрать общее количество пользователейа также общее количество пользователей, которые присоединились в этом месяце.Я могу сделать это с двумя запросами, подобными этим:

SELECT COUNT(*) 
FROM [Users]

SELECT COUNT(*) 
FROM [Users] 
WHERE MONTH(CreatedDate) = MONTH(GETDATE()) AND YEAR(CreatedDate) = YEAR(GETDATE())

Однако, может ли это быть один выбор в отличие от двух запросов?

РЕДАКТИРОВАТЬ: Чтобы устранить путаницу, я ищу2 столбца, а не два ряда.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Я верю, что это сделает то, что вы ищете:

SELECT COUNT(*), 
SUM(CASE WHEN MONTH[CreatedDate] = MONTH(GETDATE()) AND YEAR(CreatedDate) = YEAR(GETDATE()) THEN 1 ELSE 0 END) as SubCountWithCriteria
FROM [Users] 
0 голосов
/ 29 ноября 2018

Вот один из способов

(Это дает вам две строки, если вы хотите, чтобы два столбца показывали это решение с помощью CASE)

SELECT 'Total Users', COUNT(*) 
FROM [Users]

UNION ALL

SELECT 'Total this month', COUNT(*) 
FROM [Users] 
WHERE MONTH(CreatedDate) = MONTH(GETDATE()) AND YEAR(CreatedDate) = YEAR(GETDATE())
0 голосов
/ 29 ноября 2018

Использовать условное агрегирование:

SELECT COUNT(*),
       SUM(CASE WHEN MONTH(CreatedDate) = MONTH(GETDATE()) AND YEAR(CreatedDate) = YEAR(GETDATE()) THEN 1 ELSE 0 END)
FROM [Users];

Примечание: MONTH[CreatedDate] не имеет смысла, поэтому я заменил квадратные скобки скобками.

...