我似乎无法弄清楚如何将此报告合并为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
答案 0 :(得分:1)
从ProgramName
和group 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