2017-08-30 48 views
0

我有一個看起來像以下family_expenses表:CASE WHEN ROWNUM()返回行

family_id bank_code amount year month 
    001   LB   130.00 2017  1 
    001   MB   200.00 2017  1 
    001   CB   78.00 2017  2 
    001   SB   69.00 2017  3 
    009   LB   78.00 2017  1 

上面的表格有一些其他的幾列。

我需要做的是獲取家族ID的所有記錄,並將其與另一個表中的另一個子查詢結合使用。我使用CASE WHEN做了一些查詢。
我的查詢是如下:

SELECT 
(CASE WHEN t.rownum = 1 THEN t.bank_code ELSE '' END 
) as bank_code1, 
(CASE WHEN t.rownum = 1 THEN t.amount ELSE 0.00 END 
) as amt1, 
(CASE WHEN t.rownum = 2 THEN t.bank_code ELSE '' END 
) as bank_code2, 
(CASE WHEN t.rownum = 2 THEN t.amount ELSE 0.00 END 
) as amt2, 
(CASE WHEN t.rownum = 3 THEN t.bank_code ELSE '' END 
) as bank_code3, 
(CASE WHEN t.rownum = 3 THEN t.amount ELSE 0.00 END 
) as amt3 
FROM 
(
select 
ROW_NUMBER() OVER(partition by family_id Order by family_id, bank_code) 
as rownum, 
family_id, bank_code, AMOUNT 
from family_expenses 
where year = 2017 and month = 1 
and family_id= 001 
) t 

結果顯示2行的記錄。

bank_code1  amt1  bank_code2 amt2 bank_code3  amt3 
    LB   130.00 
          MB  200.00 

如何使輸出顯示所有列顯示結果在單個行中?

預期輸出:

bank_code1  amt1  bank_code2 amt2 bank_code3  amt3 
    LB   130.00   MB  200.00 
+1

使用' MAX(CASE ...)'?另外,IMO應該省略這些case語句的ELSE部分(使結果爲NULL而不是空格/ 0.00),儘管這取決於你。 – ZLK

+0

我試圖使用MAX(CASE ...),並按照您的建議捨棄ELSE,但它仍然返回2行。 – hotseetotsee

+1

嗯,我猜這不是整個查詢呢?你會得到多行的唯一原因是,如果你正在分組的東西,導致有多行。例如你不是按銀行代碼分組的,對嗎? – ZLK

回答

1

嘗試像這樣(你原來的代碼只是一個凌晨修改)...

IF OBJECT_ID('tempdb..#family_expenses', 'U') IS NOT NULL 
DROP TABLE #family_expenses; 

CREATE TABLE #family_expenses (
    family_id CHAR(3) NOT NULL, 
    bank_code CHAR(2) NOT NULL, 
    amount MONEY NOT NULL, 
    [year] INT NOT NULL, 
    [month] TINYINT NOT NULL 
    ); 
INSERT #family_expenses (family_id, bank_code, amount, [year], [month]) VALUES 
    ('001', 'LB', 130.00, 2017, 1), 
    ('001', 'MB', 200.00, 2017, 1), 
    ('001', 'CB', 78.00, 2017, 2), 
    ('001', 'SB', 69.00, 2017, 3), 
    ('009', 'LB', 78.00, 2017, 1); 

SELECT 
    t.family_id, 
    bank_code1 = MAX(CASE WHEN t.rownum = 1 THEN t.bank_code END), 
    amt1 = SUM(CASE WHEN t.rownum = 1 THEN t.amount END), 
    bank_code2 = MAX(CASE WHEN t.rownum = 2 THEN t.bank_code END), 
    amt2 = SUM(CASE WHEN t.rownum = 2 THEN t.amount END), 
    bank_code3 = MAX(CASE WHEN t.rownum = 3 THEN t.bank_code END), 
    amt3 = SUM(CASE WHEN t.rownum = 3 THEN t.amount ELSE 0.00 END) 
FROM 
    ( 
    SELECT 
     rownum = ROW_NUMBER() OVER (PARTITION BY fe.family_id ORDER BY fe.family_id, fe.bank_code), 
     fe.family_id, 
     fe.bank_code, 
     fe.amount 
    FROM 
     #family_expenses fe 
    WHERE 
     fe.year = 2017 
     AND fe.month = 1 
     AND fe.family_id = '001' 
    ) t 
GROUP BY 
    t.family_id; 

結果...

family_id bank_code1 amt1     bank_code2 amt2     bank_code3 amt3 
--------- ---------- --------------------- ---------- --------------------- ---------- --------------------------------------- 
001  LB   130.00    MB   200.00    NULL  0.0000 
+0

謝謝!就像我想要的那樣,我得到了一排。非常感謝你,祝你有美好的一天:) – hotseetotsee

+0

不客氣。這與其他人在早期的評論中表達的觀點是一樣的......有時候,在你看到一個實際的例子後,更容易理解這個想法。無論如何,我真的很感激你的反饋,並且你也有一個美好的一天。 :) –