2016-03-31 9 views
1

Ich habe eine Tabelle campaigns genannt, die die Anzahl von ‚Kacheln‘ jede Kategorie zeigt in einer E-Mail-Kampagne, wie untenSQL Server: Spaltenname von max mehrerer Spalten für jede Zeile

campaign_id  categoryA_tiles categoryB_tiles categoryC_tiles ... cateogory Z_tiles 
     1    5    7     4   ...  4 
     2    4    4     9   ...  1 

I gefunden in Sie müssen dieser Tabelle 3 Spalten hinzufügen, die die 3 am häufigsten auftretenden Kategorien (dh die Spaltennamen) für jede E-Mail-Kampagne anzeigen. Zum Beispiel möchte ich das Ergebnis wie dieser

campaign_id ... category_1 category_2 category_3 
    1  ... categoryB categoryA  categoryZ 
    2  ... categoryC categoryA  categoryB 

Hinweis sehen, dass es möglicherweise Verbindungen wie in der zweiten Reihe sein, in welchem ​​Fall ich mag würde sie angezeigt wird von links nach rechts.

Dies ist im Wesentlichen das gleiche wie this question, aber ich benutze SSMS 2012 statt MySQl. This answer ist, was ich suche, aber es ist nicht kompatibel mit SSMS. Um genau zu sein, ist der Fehler, den ich nicht beheben kann, wie @rownum definiert und verwendet wird.

Kann jemand helfen?

+0

Es wäre leicht, zu helfen, wenn Sie das Skript für Tabelle und Dummy-Daten enthalten. –

Antwort

1

Die Syntax zwischen SQL Server und anderen ist nicht die gleiche (insbesondere mit Zeilennummer - siehe die Dokumentation für ROW_NUMBER).

Try this:

DECLARE @campaigns TABLE (campaign_id int, categoryA_tiles int, categoryB_tiles int, categoryC_tiles int, categoryZ_tiles int) 

INSERT INTO @campaigns VALUES 
(1,5,7,4,4), 
(2,4,4,9,1), 
(3,2,5,9,10), 
(4,1,8,9,11) 

SELECT 
    t2.campaign_id, 
    max(case when t2.RowNumber=1 then t2.name end) as 'highest value', 
    max(case when t2.RowNumber=2 then t2.name end) as '2nd highest value', 
    max(case when t2.RowNumber=3 then t2.name end) as '3rd highest value', 
    max(case when t2.RowNumber=4 then t2.name end) as '4th highest value' 
FROM 
    (SELECT campaign_id, name, amt, ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY amt DESC) AS RowNumber 
     FROM 
     (SELECT campaign_id, categoryA_tiles AS amt, 'categoryA_tiles' AS name FROM @campaigns UNION 
     SELECT campaign_id, categoryB_tiles AS amt, 'categoryB_tiles' AS name FROM @campaigns UNION 
     SELECT campaign_id, categoryC_tiles AS amt, 'categoryC_tiles' AS name FROM @campaigns UNION 
     SELECT campaign_id, categoryZ_tiles AS amt, 'categoryZ_tiles' AS name FROM @campaigns) t1) t2 
GROUP BY t2.campaign_id 

Die Antwort wird:

campaign_id highest value  2nd highest value 3rd highest value 4th highest value 
    1   categoryB_tiles  categoryA_tiles  categoryC_tiles  categoryZ_tiles 
    2   categoryC_tiles  categoryA_tiles  categoryB_tiles  categoryZ_tiles 
    3   categoryZ_tiles  categoryC_tiles  categoryB_tiles  categoryA_tiles 
    4   categoryZ_tiles  categoryC_tiles  categoryB_tiles  categoryA_tiles 
+0

Dies ist perfekt danke und relativ einfach für mich zu verstehen (erst vor kurzem SQL lernen) – nick

1

Hallo Sie können dieses Problem lösen UNPIVOT verwenden, versuchen Sie bitte die unten stehende Skript

DECLARE @campaigns TABLE (campaign_id int, categoryA_tiles int, categoryB_tiles int, categoryC_tiles int, categoryZ_tiles int) 

INSERT INTO @campaigns VALUES (1,5,7,4,4),(2,4,4,9,1) 

SELECT T.campaign_id, 
     MAX((CASE WHEN RowNumber=1 THEN [tVal] END)) AS Category1, 
     MAX((CASE WHEN RowNumber=2 THEN [tVal] END)) AS Category2, 
     MAX((CASE WHEN RowNumber=3 THEN [tVal] END)) AS Category3 
FROM (
    SELECT campaign_id,tVal,MaxVal,ROW_NUMBER() OVER (PARTITION BY campaign_id ORDER BY MaxVal DESC) AS RowNumber 
    FROM @campaigns t1 
    UNPIVOT (MaxVal FOR tVal IN (categoryA_tiles, categoryB_tiles, categoryC_tiles ,categoryZ_tiles)) AS u 
) T 
GROUP BY T.campaign_id 

Hier können Sie hinzufügen/entfernen Sie mehr Spalte/Kategorie gemäß Ihrer Anforderung (oder können Sie mit Tabellen - Kampagnen oder anderen Tabellen verbinden) - für zusätzliche Spalten).

Ergebnis:

campaign_id Category1  Category2  Category3 
1   categoryB_tiles categoryA_tiles categoryC_tiles 
2   categoryC_tiles categoryA_tiles categoryB_tiles