我需要有关SQL查询的帮助
DELCARE @V_DATE DATETIME = CAST(GETDATE() AS DATE)
SELECT
CASE
WHEN CAST(UT.ScheduledDate AS DATE) = @V_DATE AND UT.Status = 1)
THEN 'TODAY'
WHEN CAST(UT.ScheduledDate AS DATE) > @V_DATE AND UT.Status = 1)
THEN 'PENDING'
WHEN CAST(UT.ScheduledDate AS DATE) < @V_DATE AND UT.Status = 1)
THEN 'UPCOMING'
WHEN UT.Status = 2
THEN 'COMPLETED'
WHEN UT.Status = 3
THEN 'SKIPPED'
END,
COUNT_BIG(*) AS COUNT
FROM
USERTABLE UT
GROUP BY
UT.ScheduledDate, UT.Status
假设我有这样的数据,其中状态= 1待处理,2完成,3跳过
ScheduledDate | Status
---------------+-------
7/31/2018 | 1
8/01/2018 | 1
7/28/2018 | 1
7/28/2018 | 2
7/26/2018 | 3
如何获取这样的数据
Name | Count
------------+----------
TODAY | 1
PENDING | 1
UPCOMING | 1
COMPLETED | 1
SKIPPED | 1
答案 0 :(得分:1)
您需要在GROUP BY
中重复该表达式,或者用名称定义一列。您可以使用APPLY
:
SELECT name, COUNT_BIG(*) AS COUNT
FROM USERTABLE UT OUTER APPLY
(VALUES (CASE WHEN CAST(UT.ScheduledDate AS DATE) = @V_DATE AND UT.Status = 1) THEN 'TODAY'
WHEN CAST(UT.ScheduledDate AS DATE) > @V_DATE AND UT.Status = 1) THEN 'PENDING'
WHEN CAST(UT.ScheduledDate AS DATE) < @V_DATE AND UT.Status = 1) THEN 'UPCOMING'
WHEN UT.Status = 2 THEN 'COMPLETED'
WHEN UT.Status = 3 THEN 'SKIPPED'
END)
) v(name)
GROUP BY name;
答案 1 :(得分:0)
您可以使用subquery
或cte
来避免case
表达式的重复:
WITH t AS (
SELECT CASE WHEN CAST(UT.ScheduledDate AS DATE) = @V_DATE AND UT.Status = 1) THEN 'TODAY'
WHEN CAST(UT.ScheduledDate AS DATE) > @V_DATE AND UT.Status = 1) THEN 'PENDING'
WHEN CAST(UT.ScheduledDate AS DATE) < @V_DATE AND UT.Status = 1) THEN 'UPCOMING'
WHEN UT.Status = 2 THEN 'COMPLETED'
WHEN UT.Status = 3 THEN 'SKIPPED'
END as Name
FROM USERTABLE UT
)
SELECT Name, COUNT_BIG(*) AS cnt
FROM t
GROUP BY Name;