代码之家  ›  专栏  ›  技术社区  ›  Chenna

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

  •  0
  • Chenna  · 技术社区  · 7 年前

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

    假设我有这样的数据,其中status=1-pending,2-complete,3-skipped

    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 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    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;
    
        2
  •  0
  •   Yogesh Sharma    7 年前

    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;