SQL Server:按自定义值分组以行

时间:2018-07-30 18:00:49

标签: sql sql-server

我需要有关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

2 个答案:

答案 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)

您可以使用subquerycte来避免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;