2012-05-17 15 views
4

這裏是我的代碼SQL:如何確保即使並非全部都被執行,所有SELECT個案都被表示?

SELECT 
    CASE 
     WHEN Money >= 20000 THEN '$ 20,000 + ' 
     WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $ 19,999' 
     WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999' 
     WHEN Money BETWEEN  1 AND 4999 THEN '$  1 - $ 4,999' 
     ELSE '$  0' 
    END AS [MONEY], 
     COUNT(*) AS [#], 
     MAX(Money) AS [MAX] 
    FROM MyTable 
WHERE MoneyType = 'Type A' 
GROUP BY 
    CASE 
     WHEN Money >= 20000 THEN '$ 20,000 + ' 
     WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $ 19,999' 
     WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999' 
     WHEN Money BETWEEN  1 AND 4999 THEN '$  1 - $ 4,999' 
     ELSE '$  0' 
    END 
ORDER BY MAX DESC 

現在我的問題是,我希望所有的情況下,以顯示我的結果集中的行,但是,因爲我沒有將在該行不1和4999之間的下降的任何值出現。我仍然希望該行顯示,並且只包含0的列(當然除了第一個)。任何人都可以告訴我如何修改代碼來完成此操作?也許我需要以不同的方式去做...謝謝!結果集的

例子我找...

| [MONEY]    | [#] | [MAX] | 
    | $ 20,000+   | 2  | 30,000 | 
    | $ 10,000 - $ 19,999 | 8  | 19,000 | 
    | $ 5,000 - $ 9,999 | 4  |  8,000 | 
    | $  1 - $ 4,999 | 0  |  0  |  <-- Row currently doesn't show 
    | $  0    | 12 |  0  | 
+1

你能給出樣本數據和相應的結果應該是什麼樣子? – Kevin

回答

4

你可以建立一個查詢一個CTE表,然後用它來分組,而不是Case語句。您需要進行其他三項更改

  • COUNT將需要爲COUNT(t.Money),否則當您期待零時,您會得到1。
  • 您可能希望合併您的MAX(金錢),但我不確定當它的NULL爲空時您想要的是什麼
  • 您實際上無法按MAX(MONEY)排序,因爲它可能爲空。因此,它能夠更好地使用CTE來控制順序以及


WITH Ranges AS 
(SELECT 1 id , '$ 20,000 +' description 
    UNION SELECT 2 , '$ 10,000 - $19,999' 
    UNION SELECT 3, '$ 5,000 - $ 9,999' 
    UNION SELECT 4, '$  1 - $ 4,999' 
    UNION SELECT 5, '$  0') 


SELECT 
     r.Description as money, 
     COUNT(t.Money) AS [#], 
     MAX(Money) AS [MAX] 
    FROM 
     Ranges r 
     LEFT JOIN 
     MyTable t 
     ON r.ID = CASE 
        WHEN Money >= 20000 THEN 1 
        WHEN Money BETWEEN 10000 AND 19999 THEN 2 
        WHEN Money BETWEEN 5000 AND 9999 THEN 3 
        WHEN Money BETWEEN  1 AND 4999 THEN 4 
        ELSE 5 
       END 
     AND MoneyType = 'Type A' 
GROUP BY 
    r.id, 
    r.Description 
ORDER BY r.id asc 

LIVE DEMO

+0

+1爲現場演示 – Sung

+0

謝謝工作完美!非常有趣。我也很欣賞COUNT(T.Money)上的筆記! :D – daveomcd

2

您可以添加值,然後將另外一組(沒有獲得SSMS測試):

SELECT [MONEY], SUM([#]) AS [#], MAX([MAX]) AS [MAX] FROM 
(SELECT 
    CASE 
     WHEN Money >= 20000 THEN '$ 20,000 + ' 
     WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $19,999' 
     WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999' 
     WHEN Money BETWEEN  1 AND 4999 THEN '$  1 - $ 4,999' 
     ELSE '$  0' 
    END AS [MONEY], 
     COUNT(*) AS [#], 
     MAX(Money) AS [MAX] 
    FROM MyTable 
WHERE MoneyType = 'Type A' 
GROUP BY 
    CASE 
     WHEN Money >= 20000 THEN '$ 20,000 + ' 
     WHEN Money BETWEEN 10000 AND 19999 THEN '$ 10,000 - $19,999' 
     WHEN Money BETWEEN 5000 AND 9999 THEN '$ 5,000 - $ 9,999' 
     WHEN Money BETWEEN  1 AND 4999 THEN '$  1 - $ 4,999' 
     ELSE '$  0' 
    END 
UNION ALL 
SELECT '$  0' AS [MONEY], 0 AS [#], 0 AS [MAX] 
UNION ALL 
SELECT '$  1 - $ 4,999' AS [MONEY], 0 AS [#], 0 AS [MAX] 
UNION ALL 
SELECT '$ 5,000 - $ 9,999' AS [MONEY], 0 AS [#], 0 AS [MAX] 
UNION ALL 
SELECT '$ 10,000 - $19,999' AS [MONEY], 0 AS [#], 0 AS [MAX] 
UNION ALL 
SELECT '$ 20,000 + ' AS [MONEY], 0 AS [#], 0 AS [MAX] 
) SUB 
GROUP BY [MONEY] 
+3

SQL Server不允許沒有別名的嵌入視圖 –

+0

謝謝,沒有發現 – bendataclear

+0

np。我實際上沒有看到它,直到我嘗試了它http://www.sqlfiddle.com/#!3/a8b48/3 –

1

嗯......我會怎麼做:

而不是 從 表T

我從子查詢

From 
(
Select Money, 1 as ForReal from Table t 
Union 
Select 1, 0 
Union 
Select 5000, 0 
Union 
Select 10000, 0 
Union 
Select 20001, 0 
) 

選擇我的頂部選擇將 最大(獎金* ForReal),讓您得到您的分組和0作爲MaxAmount ..

3

您可以在描述性文本存儲在一個真實的或臨時表&相應的加盟,像;

;with ranges(min,max,caption) as (
    select 10000, 19999, '$ 10,000 - $19,999' union 
    select 5000, 9999, '$ 5,000 - $ 9,999' union 
    select 1, 4999,  '$  1 - $ 4,999' 
) 
select 
    isnull(r.caption, 'no description'), 
    count(m.money) as [#], 
    isnull(max(m.money), 0) 
from 
    mytable m 
full outer join 
    ranges r on m.money between r.min and r.max 
group by 
    r.caption 
+0

不錯,但刪除where子句可能是個問題。如果OP添加了WHERE子句,你將不會得到你期望的結果 –

+0

啊是的你很正確我完全錯過了它不是一個完整的表選擇 –

相關問題