2017-08-30 171 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

不客气。这与其他人在早期的评论中表达的观点是一样的......有时候,在你看到一个实际的例子后,更容易理解这个想法。无论如何,我真的很感激你的反馈,并且你也有一个美好的一天。 :) –