2017-08-30 19 views
0

ich eine family_expenses Tabelle, die wie unten sah:CASE WHEN rownum() return Reihen

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 

Die oben stehende Tabelle haben einige andere mehrere Spalten.

Was ich tun muss, ist, alle Datensätze für eine Familien-ID zu erhalten und sie mit meiner anderen Unterabfrage aus einer anderen Tabelle zu kombinieren. Ich habe eine Abfrage mit CASE WHEN gemacht.
Meine Frage ist, wie unten:

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 

Das Ergebnis Anzeige 2 Zeilen von Datensätzen.

Wie kann ich die Ausgabeanzeige alle Spalten zeigen Ergebnis in einer einzigen Zeile?

Erwartete Ausgabe:

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

Verwenden ' MAX (FALL ...) '? Auch IMO sollten Sie den 'ELSE'-Teil dieser Case-Anweisungen weglassen (die Ergebnisse werden zu 'NULL' anstelle von Leerzeichen/0.00), obwohl das liegt an Ihnen, denke ich. – ZLK

+0

Ich habe versucht, MAX (CASE ...) zu verwenden und lasse die ELSE wie du vorgeschlagen zurück, aber es gibt immer noch 2 Zeilen zurück. – hotseetotsee

+1

Äh, ich vermute, das ist dann nicht die ganze Frage? Der einzige Grund, warum Sie mehrere Zeilen erhalten, ist, wenn Sie nach etwas gruppieren, das mehrere Zeilen verursacht. z.B. Sie gruppieren sich nicht nach der Bankleitzahl, oder? – ZLK

Antwort

1

es so versuchen (nur eine kleine Änderung Ihres ursprünglichen Code) ...

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; 

Ergebnisse ...

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

Vielen Dank dafür! Ich bekomme eine einzelne Zeile, genau wie ich es möchte. Vielen Dank und einen schönen Tag im Voraus :) – hotseetotsee

+0

Gern geschehen. Dies ist die gleiche Idee, die in früheren Kommentaren von anderen geäußert wurde ... Manchmal ist es einfach, die Idee zu verstehen, nachdem Sie ein funktionierendes Beispiel gesehen haben. Wie auch immer, ich schätze das Feedback und Sie haben einen tollen Tag. :) –