2016-05-05 12 views
0

Zuerst möchte ich jeden Fehler/Missverständnis entschuldigen, da Englisch nicht meine natürliche Sprache ist.Exportieren von Daten aus einer Tabelle in eine andere Tabelle mit einer anderen Struktur

Kontext: Ich muss Daten in einer Tabelle (tatsächlich ist es ein Ergebnis der Verknüpfung von zwei Tabellen) ziehen und in einem Bericht anzeigen. Nachfolgend finden Sie, was ich erreichen möchte, um die Daten anzuzeigen.

Lassen Sie sagen, dass die Quelltabelle die folgende Struktur und Daten enthält: Source Table

Ich möchte als ein Ergebnis mit der folgenden Struktur und Daten in eine Tabelle haben:

Result table

Die Ergebnistabelle enthält immer Spalten von Sonntag bis Samstag (3 Spalten pro Wochentag, um die 3 verschiedenen Werte für den Tag darzustellen.

Ich habe eine Lösung für mein Problem durch die Verwendung von Cursor gegen die Quellentabelle gefunden, um Daten in die Ergebnistabelle (temporäre Tabelle) zu injizieren. Aber ich möchte die Verwendung von Cursorn vermeiden.

P.S. Ich benutze SQlServer 2014 als dbms und Visual Studio2015, um die Berichte zu entwerfen.

+0

was die Logik gelten sollte, um sie in verschiedene Spalten umzuwandeln, bitte geben Sie es an. – piyushj

Antwort

0
SELECT code, 
     [SUN_nCollects] = MAX(CASE WHEN day = 'SUN' THEN nCollects END), 
     [SUN_nDels]  = MAX(CASE WHEN day = 'SUN' THEN nDels  END), 
     [SUN_%]   = MAX(CASE WHEN day = 'SUN' THEN percentage END), 
     [MON_nCollects] = MAX(CASE WHEN day = 'MON' THEN nCollects END), 
     [MON_nDels]  = MAX(CASE WHEN day = 'MON' THEN nDels  END), 
     [MON_%]   = MAX(CASE WHEN day = 'MON' THEN percentage END), 
     . . . . 
FROM source 
GROUP BY code 
0

Erstellen von Testdaten;

CREATE TABLE #TableName (Code int, percentage int, nCollects int, nDels int, [day] varchar(3)) 
INSERT INTO #TableName (Code, percentage, nCollects, nDels, [day]) 
VALUES 
('101','100','4','4','SUN') 
,('102','100','4','4','SUN') 
,('104','100','6','6','MON') 
,('101','50','4','8','TUE') 
,('102','50','4','8','TUE') 
,('104','100','2','2','TUE') 
,('105','50','1','2','TUE') 
,('106','100','2','2','TUE') 
,('106','50','2','4','WED') 

T-SQL, das die gewünschte Antwort gibt;

SELECT 
a.Code 
,ISNULL(SUM(CASE WHEN a.day = 'SUN' THEN a.nCollects END),0) SUN_nCollects 
,ISNULL(SUM(CASE WHEN a.day = 'SUN' THEN a.nDels END),0) SUN_nDels 
,CONVERT(int,(ISNULL(SUM(CASE WHEN a.day = 'SUN' THEN a.nCollects END),0)/ISNULL(SUM(CASE WHEN a.day = 'SUN' THEN a.nDels END),1))*100) [SUN%] 
,ISNULL(SUM(CASE WHEN a.day = 'MON' THEN a.nCollects END),0) MON_nCollects 
,ISNULL(SUM(CASE WHEN a.day = 'MON' THEN a.nDels END),0) MON_nDels 
,CONVERT(int,(ISNULL(SUM(CASE WHEN a.day = 'MON' THEN a.nCollects END),0)/ISNULL(SUM(CASE WHEN a.day = 'MON' THEN a.nDels END),1))*100) [MON%] 
,ISNULL(SUM(CASE WHEN a.day = 'TUE' THEN a.nCollects END),0) TUE_nCollects 
,ISNULL(SUM(CASE WHEN a.day = 'TUE' THEN a.nDels END),0) TUE_nDels 
,CONVERT(int,(ISNULL(SUM(CASE WHEN a.day = 'TUE' THEN a.nCollects END),0)/ISNULL(SUM(CASE WHEN a.day = 'TUE' THEN a.nDels END),1))*100) [TUE%] 
,ISNULL(SUM(CASE WHEN a.day = 'WED' THEN a.nCollects END),0) WED_nCollects 
,ISNULL(SUM(CASE WHEN a.day = 'WED' THEN a.nDels END),0) WED_nDels 
,CONVERT(int,(ISNULL(SUM(CASE WHEN a.day = 'WED' THEN a.nCollects END),0)/ISNULL(SUM(CASE WHEN a.day = 'WED' THEN a.nDels END),1))*100) [WED%] 
FROM #TableName a 
GROUP BY a.Code 
Verwandte Themen