按'然后'语句分组

时间:2017-02-09 18:08:22

标签: sql sql-server

我似乎无法弄清楚如何将此报告合并为DRML的两个数字。现在,当我需要避难所和LSCC组合时,它给了我5行。我做错了什么?

SELECT SUM(service.ServiceTotal) as servTotal, 
CASE
WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
WHEN ProgramName = 'Shelter' or ProgramName = 'LSCC' THEN 'DRML'
WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
WHEN ProgramName = 'Champa Operations' THEN 'Champa'
ELSE ProgramName   
END
as ProgName,
ProgramName, CONVERT(date,service.BeginDate) as BeginDate
FROM dbo.Service
JOIN Enrollment on service.EnrollmentID = Enrollment.EnrollmentID
JOIN Program on Enrollment.ProgramID = program.ProgramID
WHERE dbo.service.ServiceTypeID IN (264,429,430,266,431,432,265,273,433,434,493,494,495,500,501,502,496,498,497,499, 270,436,462,435,272,438,463,437,271,460,441,461,442,267,446,448,447,445,443,444,459,269,457,458,456,454,455,268,452,453,451,449,450,514,
275,276,277) and service.DeletedDate > GETDATE() and DATEDIFF(day,Service.BeginDate, GETDATE()) = 1 --and service.ProvidedToEntityID = 161737
and Enrollment.programID IN (84,87,118,126,119,150)
GROUP BY ProgramName, CONVERT(date,service.BeginDate)
ORDER BY CONVERT(date, service.BeginDate), ProgramName

3 个答案:

答案 0 :(得分:1)

ProgramNamegroup by列表中取出select;并将case表达式添加到group by;并在ProgramName中将ProgName更改为order by

SELECT 
    servTotal = SUM(service.ServiceTotal) 
  , ProgName = CASE
      WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
      WHEN ProgramName = 'Shelter' or ProgramName = 'LSCC' THEN 'DRML'
      WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
      WHEN ProgramName = 'Champa Operations' THEN 'Champa'
      ELSE ProgramName   
      END
--, ProgramName
  , BeginDate = CONVERT(date,service.BeginDate) 
FROM dbo.Service
JOIN Enrollment on service.EnrollmentID = Enrollment.EnrollmentID
JOIN Program on Enrollment.ProgramID = program.ProgramID
WHERE dbo.service.ServiceTypeID IN (264,429,430,266,431,432,265,273,433,434,493,494,495,500,501,502,496,498,497,499, 270,436,462,435,272,438,463,437,271,460,441,461,442,267,446,448,447,445,443,444,459,269,457,458,456,454,455,268,452,453,451,449,450,514,
275,276,277) and service.DeletedDate > GETDATE() and DATEDIFF(day,Service.BeginDate, GETDATE()) = 1 --and service.ProvidedToEntityID = 161737
and Enrollment.programID IN (84,87,118,126,119,150)
GROUP BY 
  --ProgramName
  CASE
    WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
    WHEN ProgramName = 'Shelter' or ProgramName = 'LSCC' THEN 'DRML'
    WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
    WHEN ProgramName = 'Champa Operations' THEN 'Champa'
    ELSE ProgramName   
  END
  , CONVERT(date,service.BeginDate)
ORDER BY CONVERT(date, service.BeginDate), ProgName

答案 1 :(得分:1)

您需要GROUP BY CASE表达式而不是ProgramName

SELECT  SUM(s.ServiceTotal) servTotal, 
        CASE
            WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
            WHEN ProgramName IN ('Shelter','LSCC') THEN 'DRML'
            WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
            WHEN ProgramName = 'Champa Operations' THEN 'Champa'
            ELSE ProgramName   
        END ProgName,
        CONVERT(date,s.BeginDate) BeginDate
FROM dbo.Service s
INNER JOIN Enrollment e
    ON s.EnrollmentID = e.EnrollmentID
INNER JOIN Program p 
    ON e.ProgramID = p.ProgramID
WHERE s.ServiceTypeID IN (264,429,430,266,431,432,265,273,433,434,493,494,495,500,
501,502,496,498,497,499, 270,436,462,435,272,438,463,437,271,460,441,461,442,267,
446,448,447,445,443,444,459,269,457,458,456,454,455,268,452,453,451,449,450,514,
275,276,277) 
AND s.DeletedDate > GETDATE() AND DATEDIFF(DAY,s.BeginDate, GETDATE()) = 1 --and service.ProvidedToEntityID = 161737
AND Enrollment.programID IN (84,87,118,126,119,150)
GROUP BY CASE
            WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
            WHEN ProgramName IN ('Shelter','LSCC') THEN 'DRML'
            WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
            WHEN ProgramName = 'Champa Operations' THEN 'Champa'
            ELSE ProgramName   
         END,
         CONVERT(date,service.BeginDate)
ORDER BY CONVERT(date, service.BeginDate), 
         CASE
            WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
            WHEN ProgramName IN ('Shelter','LSCC') THEN 'DRML'
            WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
            WHEN ProgramName = 'Champa Operations' THEN 'Champa'
            ELSE ProgramName   
         END;

答案 2 :(得分:0)

GROUPING BY列的所有不同值都是ProgramName,而不是您指定的CASE值。

首先选择子查询或CTE中的所有值,然后在这些结果上选择SUM

SELECT SUM(service.ServiceTotal) as servTotal, ProgName, BeginDate
FROM(
    SELECT service.ServiceTotal, 
    CASE
    WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
    WHEN ProgramName = 'Shelter' or ProgramName = 'LSCC' THEN 'DRML'
    WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
    WHEN ProgramName = 'Champa Operations' THEN 'Champa'
    ELSE ProgramName   
    END
    as ProgName,
    CONVERT(date,service.BeginDate) as BeginDate
    FROM dbo.Service
    JOIN Enrollment on service.EnrollmentID = Enrollment.EnrollmentID
    JOIN Program on Enrollment.ProgramID = program.ProgramID
    WHERE dbo.service.ServiceTypeID IN (264,429,430,266,431,432,265,273,433,434,493,494,495,500,501,502,496,498,497,499, 270,436,462,435,272,438,463,437,271,460,441,461,442,267,446,448,447,445,443,444,459,269,457,458,456,454,455,268,452,453,451,449,450,514,
    275,276,277) and service.DeletedDate > GETDATE() and DATEDIFF(day,Service.BeginDate, GETDATE()) = 1 --and service.ProvidedToEntityID = 161737
    and Enrollment.programID IN (84,87,118,126,119,150)) AS t
GROUP BY ProgName, BeginDate
ORDER BY BeginDate, ProgName

WITH cte(ServiceTotal, ProgName, BeginDate) AS
(
    SELECT service.ServiceTotal, 
    CASE
    WHEN ProgramName = 'Crossing Operations' THEN 'Crossing'
    WHEN ProgramName = 'Shelter' or ProgramName = 'LSCC' THEN 'DRML'
    WHEN ProgramName = 'Farm Operations' THEN 'Harvest Farm'
    WHEN ProgramName = 'Champa Operations' THEN 'Champa'
    ELSE ProgramName   
    END
    as ProgName,
    CONVERT(date,service.BeginDate) as BeginDate
    FROM dbo.Service
    JOIN Enrollment on service.EnrollmentID = Enrollment.EnrollmentID
    JOIN Program on Enrollment.ProgramID = program.ProgramID
    WHERE dbo.service.ServiceTypeID IN (264,429,430,266,431,432,265,273,433,434,493,494,495,500,501,502,496,498,497,499, 270,436,462,435,272,438,463,437,271,460,441,461,442,267,446,448,447,445,443,444,459,269,457,458,456,454,455,268,452,453,451,449,450,514,
    275,276,277) and service.DeletedDate > GETDATE() and DATEDIFF(day,Service.BeginDate, GETDATE()) = 1 --and service.ProvidedToEntityID = 161737
    and Enrollment.programID IN (84,87,118,126,119,150)
)

SELECT SUM(service.ServiceTotal) as servTotal, ProgName, BeginDate
FROM cte
GROUP BY ProgName, BeginDate
ORDER BY BeginDate, ProgName