我有一个SQL查询:
SELECT
TAT,
SUM(CASE WHEN [Month Entered] = 1 THEN 1 ELSE 0 END) JAN,
SUM(CASE WHEN [Month Entered] = 2 THEN 1 ELSE 0 END) FEB,
SUM(CASE WHEN [Month Entered] = 3 THEN 1 ELSE 0 END) MAR,
SUM(CASE WHEN [Month Entered] = 4 THEN 1 ELSE 0 END) APR,
SUM(CASE WHEN [Month Entered] = 5 THEN 1 ELSE 0 END) MAY,
SUM(CASE WHEN [Month Entered] = 6 THEN 1 ELSE 0 END) JUN,
SUM(CASE WHEN [Month Entered] = 7 THEN 1 ELSE 0 END) JUL,
SUM(CASE WHEN [Month Entered] = 8 THEN 1 ELSE 0 END) AUG,
SUM(CASE WHEN [Month Entered] = 9 THEN 1 ELSE 0 END) SEP,
SUM(CASE WHEN [Month Entered] = 10 THEN 1 ELSE 0 END) OCT,
SUM(CASE WHEN [Month Entered] = 11 THEN 1 ELSE 0 END) NOV,
SUM(CASE WHEN [Month Entered] = 12 THEN 1 ELSE 0 END) [DEC]
FROM
[SalesDWH].[dbo].[TurnAround]
where DATEPART(yyyy,[datetime entered])=2010
GROUP BY TAT
ORDER BY 1;
这是它的回报:
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| TAT | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 0 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 7 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 18 | 28 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 19 | 39 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 53 | 0 | 0 |
| 20 | 106 | 0 | 0 | 0 | 0 | 0 | 2 | 17 | 0 | 1 | 2 | 0 |
| 21 | 113 | 12 | 0 | 0 | 0 | 22 | 1 | 81 | 137 | 27 | 1 | 110 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
我希望输出为:
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| TAT | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| 0 | | | | 3 | | | | | | | | |
| 1 | 1 | | | | | | | | | | | |
| 2 | | | | | | | | | | | | |
| 3 | | | | | | | | | | | | |
| 4 | | | | | | | | | | | | |
| 5 | | | | | | | | | | | | |
| 6 | | | | | | | | | | | | |
| 7 | | | | | 1 | | | | | | | |
| 8 | | | | | | | | | | | | |
| 9 | | | | | | | | | | | | |
| 10 | | | | | | | | | | | | |
| 11 | | | | | | | | | | | | |
| 12 | | | | | | | | | | | | |
| 13 | | | | | | | | | | | | |
| 14 | | | | | | | | | | | | |
| 15 | | | | | | | | | | | | |
| 16 | | | | | | | | | | | | |
| 17 | | | | | | | | | | | | |
| 18 | 28 | | | | | | | | | | | |
| 19 | 39 | | | | | 1 | | | | 53 | | |
| 20 | 106 | | | | | | 2 | 17 | | 1 | 2 | |
| 21 | 113 | 12 | | | | 22 | 1 | 81 | 137 | 27 | 1 | 110 |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
请注意,所有0
已被删除,TAT
列是连续的0,1,2,3,4,......
我如何强制这两个条件?
我需要这个TAT的值在0到191之间。
对于192及更高的值,我希望192处的TAT是所有值192和更高的总和
答案 0 :(得分:1)
编辑获取新信息
;WITH d AS ( SELECT TAT = CASE WHEN TAT > 191 THEN 192 ELSE TAT END,
SUM(CASE WHEN [Month Entered] = 1 THEN 1 ELSE 0 END) AS JAN,
SUM(CASE WHEN [Month Entered] = 2 THEN 1 ELSE 0 END) AS FEB,
SUM(CASE WHEN [Month Entered] = 3 THEN 1 ELSE 0 END) AS MAR,
SUM(CASE WHEN [Month Entered] = 4 THEN 1 ELSE 0 END) AS APR,
SUM(CASE WHEN [Month Entered] = 5 THEN 1 ELSE 0 END) AS MAY,
SUM(CASE WHEN [Month Entered] = 6 THEN 1 ELSE 0 END) AS JUN,
SUM(CASE WHEN [Month Entered] = 7 THEN 1 ELSE 0 END) AS JUL,
SUM(CASE WHEN [Month Entered] = 8 THEN 1 ELSE 0 END) AS AUG,
SUM(CASE WHEN [Month Entered] = 9 THEN 1 ELSE 0 END) AS SEP,
SUM(CASE WHEN [Month Entered] = 10 THEN 1 ELSE 0 END) AS OCT,
SUM(CASE WHEN [Month Entered] = 11 THEN 1 ELSE 0 END) AS NOV,
SUM(CASE WHEN [Month Entered] = 12 THEN 1 ELSE 0 END) AS DEC
FROM [SalesDWH].[dbo].[TurnAround]
WHERE [datetime entered] >= '20100101'
AND [datetime entered] < '20110101'
GROUP BY CASE WHEN TAT > 191 THEN 192 ELSE TAT END
),
n AS ( SELECT TOP (193) n = ROW_NUMBER() OVER (ORDER BY [object_id]) - 1
FROM sys.all_columns ORDER BY [object_id]
)
SELECT TAT = n.n,
JAN = COALESCE(RTRIM(NULLIF(JAN, 0)), ''),
FEB = COALESCE(RTRIM(NULLIF(FEB, 0)), ''),
MAR = COALESCE(RTRIM(NULLIF(MAR, 0)), ''),
APR = COALESCE(RTRIM(NULLIF(APR, 0)), ''),
MAY = COALESCE(RTRIM(NULLIF(MAY, 0)), ''),
JUN = COALESCE(RTRIM(NULLIF(JUN, 0)), ''),
JUL = COALESCE(RTRIM(NULLIF(JUL, 0)), ''),
AUG = COALESCE(RTRIM(NULLIF(AUG, 0)), ''),
SEP = COALESCE(RTRIM(NULLIF(SEP, 0)), ''),
OCT = COALESCE(RTRIM(NULLIF(OCT, 0)), ''),
NOV = COALESCE(RTRIM(NULLIF(NOV, 0)), ''),
DEC = COALESCE(RTRIM(NULLIF(DEC, 0)), '')
FROM n LEFT OUTER JOIN d ON n.n = d.TAT
ORDER BY n.n; -- do not use ordinal numbers for ORDER BY!
答案 1 :(得分:1)
首先,您需要创建一个包含第一列所有值并使用它连接数据表的表
然后你在这个之上做另一个查询(所以这个是子查询),每个月的列将是
case jan when 0 then '' else cast(jan as nvarchar) end jan