2017-08-30 10 views
0

Iは以下のように見えたfamily_expensesテーブルを有する:CASE 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 

出力をすべての列に表示するには、結果を1行で表示できますか?

予想される出力:

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

使用...これ(あなたの元のコードのちょうどおしっこ修正)のようにそれを試してみてくださいMAX(CASE ...) '?また、IMOでは、それらのcase文の 'ELSE'部分を残しておく必要があります(空白スペース/ 0.00の代わりに結果をNULLにする)。これはあなた次第ですが、そうです。 – 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

よろしくお願いします。これは以前のコメントで他人によって表現されていたのと同じアイデアです...実際に実際の例を見た後にアイデアを把握するほうが簡単な場合もあります。いずれにせよ、私は本当にフィードバックに感謝し、あなたは素晴らしい一日を持っています。 :) –