2012-06-28 152 views
0

我查詢的結果孔將返回:填充在查詢

+------+------+------+------+------+------+------+-------+------+------+------+------+-----+ 
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Bla | 
+------+------+------+------+------+------+------+-------+------+------+------+------+-----+ 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |  0 | 0 | 0 | 2 | 0 | 13 | 
| 1 | 0 | 0 | 0 | 0 | 0 | 0 |  0 | 0 | 2 | 0 | 0 | 14 | 
| 0 | 0 | 0 | 0 | 0 | 9 | 0 |  0 | 0 | 0 | 8 | 37 | 29 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 |  0 | 0 | 1 | 0 | 374 | 30 | 
| 0 | 0 | 1 | 0 | 78 | 2 | 4 |  8 | 57 | 169 | 116 | 602 | 31 | 
| 156 | 255 | 79 | 75 | 684 | 325 | 289 | 194 | 407 | 171 | 584 | 443 | 32 | 
| 1561 | 2852 | 2056 | 796 | 2004 | 1755 | 879 | 1052 | 1490 | 1683 | 2532 | 2381 | 33 | 
| 4167 | 3841 | 4798 | 3399 | 4132 | 5849 | 3157 | 4381 | 4424 | 4487 | 4178 | 5343 | 34 | 
| 5472 | 5939 | 5768 | 4150 | 7483 | 6836 | 6346 | 6288 | 6850 | 7155 | 5706 | 5231 | 35 | 
| 5749 | 4741 | 5264 | 4045 | 6544 | 7405 | 7524 | 6625 | 6344 | 5508 | 6513 | 3854 | 36 | 
| 5464 | 6323 | 7074 | 4861 | 7244 | 6768 | 6632 | 7389 | 8077 | 8745 | 6738 | 5039 | 37 | 
| 5731 | 7205 | 7476 | 5734 | 9103 | 9244 | 7339 | 8970 | 9726 | 9089 | 6328 | 5512 | 38 | 
| 7262 | 6149 | 8231 | 6654 | 9886 | 9834 | 9306 | 10065 | 9983 | 9984 | 6738 | 5806 | 39 | 
| 5886 | 6934 | 7137 | 6978 | 9034 | 9155 | 7389 | 9437 | 9711 | 8665 | 6593 | 5337 | 40 | 
+------+------+------+------+------+------+------+-------+------+------+------+------+-----+ 

,你可以看到BLA列從13開始我希望它是1,那麼2開始,然後是3等......我不希望數據有任何空白。有差距的原因是所有的月份是0針對特定bla

怎麼做我得到的結果集包括BLA,甚至是那些將產生0換了個ALL值?

這裏是理想的結果:

+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Bla | 
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 3 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 6 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 8 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 9 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 11 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 12 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 13 | 
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | 14 | 
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 15 | 
| … | … | … | … | … | … | … | … | … | … | … | … | … | 
+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 

,這裏是我的查詢:

SELECT CASE WHEN SUM(Jan) is not null THEN SUM(Jan) ELSE 0 end Jan, 
     CASE WHEN SUM(Feb) is not null THEN SUM(Feb) ELSE 0 end Feb, 
     CASE WHEN SUM(Mar) is not null THEN SUM(Mar) ELSE 0 end Mar, 
     CASE WHEN SUM(Apr) is not null THEN SUM(Apr) ELSE 0 end Apr, 
     CASE WHEN SUM(May) is not null THEN SUM(May) ELSE 0 end May, 
     CASE WHEN SUM(Jun) is not null THEN SUM(Jun) ELSE 0 end Jun, 
     CASE WHEN SUM(Jul) is not null THEN SUM(Jul) ELSE 0 end Jul, 
     CASE WHEN SUM(Aug) is not null THEN SUM(Aug) ELSE 0 end Aug, 
     CASE WHEN SUM(Sep) is not null THEN SUM(Sep) ELSE 0 end Sep, 
     CASE WHEN SUM(Oct) is not null THEN SUM(Oct) ELSE 0 end Oct, 
     CASE WHEN SUM(Nov) is not null THEN SUM(Nov) ELSE 0 end Nov, 
     CASE WHEN SUM(Dec) is not null THEN SUM(Dec) ELSE 0 end Dec, 
     CASE WHEN Bla > 191 THEN 192 ELSE Bla END Bla 
FROM CTE 
GROUP BY CASE WHEN Bla > 191 THEN 192 ELSE Bla END 
order by bla 
+0

不是你的問題的答案,而是'CASE當SUM(Jan)不爲空THEN SUM(Jan)ELSE 0 end'時,你可以寫出更簡潔的表達式'ISNULL(SUM(Jan),0)'。 –

+0

非常感謝@MarkByers,這很有幫助 –

+0

'bla'有多少個值? – Lamak

回答

3

您可以使用一個數字表或具有從1所有值設置爲192,您可以創建一些表該表,使用循環或遞歸CTE,使用一些系統視圖等,在旅途中使用一個。這是一個示例:

SELECT ISNULL(SUM(Jan),0) Jan, 
     ISNULL(SUM(Feb),0) Feb, 
     ISNULL(SUM(Mar),0) Mar, 
     ISNULL(SUM(Apr),0) Apr, 
     ISNULL(SUM(May),0) May, 
     ISNULL(SUM(Jun),0) Jun, 
     ISNULL(SUM(Jul),0) Jul, 
     ISNULL(SUM(Aug),0) Aug, 
     ISNULL(SUM(Sep),0) Sep, 
     ISNULL(SUM(Oct),0) Oct, 
     ISNULL(SUM(Nov),0) Nov, 
     ISNULL(SUM(Dec),0) Dec, 
     A.RN Bla 
FROM ( SELECT *, RN=ROW_NUMBER() OVER(ORDER BY object_id) 
     FROM sys.all_objects) A 
LEFT JOIN CTE B 
ON A.RN = CASE WHEN B.Bla > 191 THEN 192 ELSE B.Bla END 
WHERE A.RN BETWEEN 1 AND 192 
GROUP BY A.RN 
order by A.RN 
+0

非常感謝!你爲我提供瞭如此驚人的指導和幫助! cachai? –

+0

lamak im抱歉,我稍微需要更改查詢,而且您的解決方案對於此操作無法正常工作 –

+0

您是否願意再次查看我的查詢並查看是否有快速修復? –

1

我創造了什麼可能是你所需要的演示,它具有布拉列的幾個版本,Bla3在結果中顯示的最終版本,你可以很容易地修改此查詢,以便對您的工作表中,試試吧:

DECLARE @tbl TABLE (Jan INT, Feb INT, Mar INT, Apr INT, May INT, Jun INT, 
Jul INT, Aug INT, Sep INT, Oct INT, Nov INT, Dec INT, Bla INT) 
INSERT @tbl VALUES 
(0,0,0,0,0,0,0,0,0,0,0,4,1), 
(0,0,0,0,0,0,0,0,0,0,0,4,1), 
(0,0,0,0,0,0,0,0,0,0,0,0,12), 
(0,12,10,10,10,11,10,0,0,0,0,21,35), 
(0,12,10,10,10,11,10,0,0,0,0,22,47), 
(0,12,10,10,10,11,10,0,0,0,0,23,192), 
(0,12,10,10,10,11,10,0,0,0,0,24,203) 

;WITH a AS (
    SELECT *, DENSE_RANK() OVER (ORDER BY Bla) Bla2 
    FROM @tbl 
), 
b AS (
    SELECT *, 
      CASE WHEN Bla > 191 THEN 192 ELSE Bla2 END Bla3 
    FROM a 
) 

SELECT ISNULL(SUM(Jan), 0) Jan, 
     ISNULL(SUM(Feb), 0) Feb, 
     ISNULL(SUM(Mar), 0) Mar, 
     ISNULL(SUM(Apr), 0) Apr, 
     ISNULL(SUM(May), 0) May, 
     ISNULL(SUM(Jun), 0) Jun, 
     ISNULL(SUM(Jul), 0) Jul, 
     ISNULL(SUM(Aug), 0) Aug, 
     ISNULL(SUM(Sep), 0) Sep, 
     ISNULL(SUM(Oct), 0) Oct, 
     ISNULL(SUM(Nov), 0) Nov, 
     ISNULL(SUM(Dec), 0) Dec, 
     Bla3 
FROM b 
GROUP BY Bla3 
ORDER BY Bla3