2011-09-05 60 views
0

我有以下SELECT ...SQL:即使SELECT CASE沒有被觸發,如何獲得一行?

SELECT CASE WHEN cola < 0 THEN '-' 
       WHEN cola > 0 THEN '+' 
       ELSE '=' 
      END 
      SUM(colb), SUM(colc), SUM(cold), 
      MAX(CASE WHEN cola < 0 THEN 1 
        WHEN cola > 0 THEN 3 
        ELSE 2 
      ) AS Sort 
     FROM Table1 
    WHERE this = that 
    GROUP BY CASE WHEN cola < 0 THEN '-' 
       WHEN cola > 0 THEN '+' 
       ELSE '=' END 
    ORDER BY cold 

這就是我得到:

cola colb colc cold 
-  1  2  1 
+  13  0  3 

這是我想什麼:

cola colb colc cold 
-  1  2  1 
=  0  0  2 
+  13  0  3 

當我得到結果集時,我有'+'和' - '行,但沒有'='行,因爲沒有任何'0'值觸發ELSE。我如何設置它,以便如果是這種情況,那麼它在我的SELECT語句中仍然會有'='行?

謝謝! *如果需要更多的選擇,請讓我知道。

+1

您需要提供一些更多的SQL語句。目前尚不清楚您是否需要外部連接或其他內容。 –

+1

聽起來好像你想讓0表示,儘管那個值不在'可樂'列中。它是否正確?您可以在結果集之前和之後包含示例嗎? –

回答

3
SELECT 
     foo.symbol, 
     SUM(colb), SUM(colc), SUM(cold) 
    FROM 
     (SELECT '-' AS Symbol, 1 As Sort 
     UNION ALL SELECT '=', 2 
     UNION ALL SELECT '+', 3 
     ) foo 
     LEFT JOIN 
     Table1 ON foo.symbol = CASE WHEN cola < 0 THEN '-' 
      WHEN cola > 0 THEN '+' 
      ELSE '=' 
     END 
WHERE this = that 
GROUP BY foo.symbol, foo.sort 
ORDER BY foo.sort 

您也可能需要Table1的派生表以正確應用過濾器。你可以推個CASE這個

編輯,評論後,甚至簡單的感謝@WReach

SELECT 
     foo.SignAndSort, 
     SUM(colb), SUM(colc), SUM(cold) 
    FROM 
     (SELECT '-1' AS SignAndSort 
     UNION ALL SELECT '0' 
     UNION ALL SELECT '-1' 
     ) foo 
     LEFT JOIN 
     Table1 ON foo.SignAndSort = SIGN(cola) 
WHERE this = that 
GROUP BY foo.SignAndSort 
ORDER BY foo.SignAndSort 
+1

@ p.campbell:100%正確,將添加它。衛生署! – gbn

+2

+1如果給'foo'添加一個列,給每個符號提供所需的符號,那麼'CASE'表達式可以簡化爲'foo。「sign」= sign(cola)'。 – WReach

+1

@WReach:好點。我經常使用SIGN:這是一個有用但被忽視的功能 – gbn

1

聽起來好像你想要表示0,即使該值不在cola列中。

我的第一個辦法是:

  • 聚集的總和在派生表(t
  • UNION,對包含您的平等一行單行另一個派生表。 (t2
  • 選擇最大值,當UNION ALL產生重複值時,會在表t中實際存在等於的情況下過濾掉重複項。
SELECT MySymbol, MAX(MySumB) AS MySumB, 
        MAX(MySumC) AS MySumC, 
        MAX(MySumD) AS MySumD 
FROM ( 
     SELECT MySymbol,MySumB,MySumC,MySumD 
     FROM (
       SELECT CASE WHEN cola < 0 THEN '-' 
         WHEN cola > 0 THEN '+' 
         ELSE '=' 
        END AS MySymbol, 
        SUM(colb) AS MySumB, SUM(colc) AS MySumC, SUM(cold) AS MySumD, 
        MAX(CASE WHEN cola < 0 THEN 1 
          WHEN cola > 0 THEN 3 
          ELSE 2 
        ) AS Sort 
       FROM Table1 
       WHERE this = that 
       GROUP BY CASE WHEN cola < 0 THEN '-' 
          WHEN cola > 0 THEN '+' 
          ELSE '=' END     
      UNION ALL 
      SELECT '=' AS MySymbol, 0,0,0,0 
     ) t 
) t2 
GROUP BY MySymbol 
ORDER BY MySumD 

這可以一直有點更緊一個解決方案,如果我們知道你是在使用RDBMS。以上是ANSI兼容的,所以它可以在任何地方工作。對於使用臨時表或表變量的Oracle,SQL Server或MySQL,可能存在一個不太詳細的解決方案。由於RDBMS沒有具體說明,我無法給出具體平臺的具體答案,並採用了通用方法。