0

我有一个 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,......

我如何强制这两个条件

对于 0 到 191 之间的 TAT 值,我需要这个。

对于 192 和更大的值,我希望 192 处的 TAT 是 192 和更大的所有值的总和

4

2 回答 2

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!
于 2012-05-22T23:12:33.243 回答
1

首先,您需要为第一列创建一个包含所有值的表,并将数据表与它连接起来

然后你在这个之上做另一个查询(所以这个是子查询),每个月列将是

 case jan when 0 then '' else cast(jan as nvarchar) end jan
于 2012-05-22T23:19:48.583 回答