2016-09-18 6 views
1

Entschuldigung, ich habe keinen guten Titel für die Frage gefunden, also ändern Sie ihn entsprechend.Mehrere Zeilen in einer Spalte zusammenfassen SQL-Abfrage

Ich kann meine Frage mit einem minimalen Beispiel in MS SQL Server 2012 beschreiben:

create table #tmp 
(
    RowID varchar(10), 
    SectionCode int, 
    SectionName varchar(10) 
) 

insert into #tmp values('Record1' , 1 , 'AB'); 
insert into #tmp values('Record1' , 2 , 'CD'); 
insert into #tmp values('Record1' , 3 , 'EF'); 
insert into #tmp values('Record2' , 1 , 'AB'); 
insert into #tmp values('Record2' , 4 , 'GH'); 
insert into #tmp values('Record2' , 5 , 'IJ'); 
insert into #tmp values('Record3' , 2 , 'CD'); 
insert into #tmp values('Record3' , 5 , 'IJ'); 

Ich versuche, eine eine Zeile pro Rekordergebnis zu schaffen, in dem jeder Abschnitt eine Spalte ist und wenn es eine Reihe einem Abschnitt zugeordnet ist, wird der entsprechende Spaltenwert erhöht. Das ist (nicht), was ich will (die gleichen Aufzeichnungsdaten auf verschiedenen Zeilen)

select RowID, 
    case when SectionName = 'AB' then 1 else 0 end as [AB Section] , 
    case when SectionName = 'CD' then 1 else 0 end as [CD Section] , 
    case when SectionName = 'EF' then 1 else 0 end as [EF Section] , 
    case when SectionName = 'GH' then 1 else 0 end as [GH Section] , 
    case when SectionName = 'IJ' then 1 else 0 end as [IJ Section] 
           from #tmp 
group by RowID , SectionName 

, die diesen Ausgang gibt:

Wrong Output Result

Ich brauche diese:

Correct Output

Vielen Dank im Voraus

+0

Wie @ Bill erwähnt Wert von IJ für Record2 ist 1. Dank. –

Antwort

1

Ich glaube, Sie dies wünschen:

select RowID, 
     sum(case when SectionName = 'AB' then 1 else 0 end) as [AB Section] , 
     sum(case when SectionName = 'CD' then 1 else 0 end) as [CD Section] , 
     sum(case when SectionName = 'EF' then 1 else 0 end) as [EF Section] , 
     sum(case when SectionName = 'GH' then 1 else 0 end) as [GH Section] , 
from #tmp 
group by RowID; 

Das heißt, Sie Aggregationsfunktionen benötigen. Und die group by sollte die Spalten enthalten, die Sie jede Zeile definieren möchten (d. H. Nur die RowId).

+0

"der entsprechende Spaltenwert ist erhöht" deutet auf 'sum (.. 1 ..0)' ich denke. – Serg

+0

@Serg. . . Das macht Sinn. Die Beispieldaten unterscheiden nicht zwischen den beiden Fällen. –

2

Sie können Pivot wie unten beschrieben verwenden und die Werte der Abschnitte beliebig ändern.

SELECT rowid 
,CASE 
    WHEN ab IS NULL 
     THEN 0 
    ELSE 1 
    END AS ab 
,CASE 
    WHEN cd IS NULL 
     THEN 0 
    ELSE 1 
    END AS cd 
,CASE 
    WHEN ef IS NULL 
     THEN 0 
    ELSE 1 
    END AS ef 
,CASE 
    WHEN gh IS NULL 
     THEN 0 
    ELSE 1 
    END AS gh 
,CASE 
    WHEN ij IS NULL 
     THEN 0 
    ELSE 1 
    END AS ij 
FROM (
SELECT * 
FROM #tmp 
PIVOT(MAX(Sectioncode) FOR Sectionname IN (
      AB 
      ,CD 
      ,EF 
      ,GH 
      ,IJ 
      )) pvt 
) tab 

Ich denke, das Ergebnis, das Sie nicht für Datensatz-ID korrekt dargestellt ist 2. ij der Aufzeichnung id 2 1 sein sollte

+0

Danke, ist Ihre Lösung besser in Bezug auf die Leistung? Es erscheint mir komplizierter. –

Verwandte Themen