2016-04-28 13 views
5

Ich habe die folgende Tabelle. (kein Primärschlüssel in dieser Tabelle)Verwendung von Dyamic Pivot Abfrage für diese?

ID | IC  | Name |  UGCOS | MCOS  
--------------------------------------------------------- 
1AA | A123456B | Edmund | Australia | Denmark  
1AA | A123456B | Edmund | Australia | France  
2CS | C435664C | Grace | Norway  | NULL  
3TG | G885595H | Rae  | NULL  | Japan  

Ich muss das Ergebnis so erhalten.

ID | IC  | Name |  UGCOS | MCOS  | MCOS1 
-------------------------------------------------------------------- 
1AA | A123456B | Edmund | Australia | Denmark | France 
2CS | C435664C | Grace | Norway  | NULL  | NULL 
3TG | G885595H | Rae  | NULL  | Japan | NULL 

Gegoogled herum und scheint wie PIVOT ist, was ich tun muss. Ich bin mir jedoch nicht sicher, wie dies für meine Tabellen implementiert werden kann. Es wäre eine große Hilfe, wenn mir jemand dabei helfen könnte. Vielen Dank!

+0

Haben Sie spezielle Spalten in der Ausgabe benötigen (wie 'MCOS, MCOS1, MCOS2 ...)'? Gibt es eine obere Grenze? Wouldl ein verkettetes Ergebnis in einer einzigen Spalte (wie 'MCOS' mit' Dänemark, Frankreich' auch für Ihre Bedürfnisse? – Shnugo

+1

Warum nicht 'Frankreich | Dänemark'? – Strawberry

+0

@Shnugo Ja wird es MCOS, MCOS1, MCOS2 usw. ohne obere Grenze sein "Ich kann nicht mit verketteten Ergebnissen tun. Ich muss die Spalten teilen. – Devora

Antwort

2

ich eine zweite Antwort erstellen werden, da dieser Ansatz etwas ganz anderes von meinem ersten ist:

Diese dynamische Abfrage findet zuerst die maximale Anzahl einer eindeutigen ID und erstellt dann einen dynamischen Drehpunkt

CREATE TABLE #tmpTbl (ID VARCHAR(100),IC VARCHAR(100),Name VARCHAR(100),UGCOS VARCHAR(100),MCOS VARCHAR(100)) 
INSERT INTO #tmpTbl VALUES 
('1AA','A123456B','Edmund','Australia','Denmark')  
,('1AA','A123456B','Edmund','Australia','France') 
,('1AA','A123456B','Edmund','Australia','OneMore') 
,('2CS','C435664C','Grace','Norway',NULL)  
,('3TG','G885595H','Rae',NULL,'Japan'); 
GO 

DECLARE @maxCount INT=(SELECT TOP 1 COUNT(*) FROM #tmpTbl GROUP BY ID ORDER BY COUNT(ID) DESC); 
DECLARE @colNames VARCHAR(MAX)= 
(
    STUFF 
    (
     (
     SELECT TOP(@maxCount) 
       ',MCOS' + CAST(ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS VARCHAR(10)) 
     FROM sys.objects --take any large table or - better! - an numbers table or a tally CTE 
     FOR XML PATH('') 
     ),1,1,'' 
    ) 
); 

DECLARE @cmd VARCHAR(MAX)= 
'SELECT p.* 
FROM 
(
    SELECT * 
      ,''MCOS'' + CAST(ROW_NUMBER() OVER(PARTITION BY ID ORDER BY (SELECT NULL)) AS VARCHAR(10)) AS colName 
    FROM #tmpTbl 
) AS tbl 
PIVOT 
(
    MIN(MCOS) FOR colName IN(' + @colNames + ') 
) AS p'; 

EXEC(@cmd); 
GO 

DROP TABLE #tmpTbl; 

Das Ergebnis

1AA A123456B Edmund Australia Denmark France OneMore 
2CS C435664C Grace Norway  NULL NULL NULL 
3TG G885595H Rae  NULL  Japan NULL NULL 
+0

Es funktioniert @ Shnugo DANKE! – Devora

+0

@Devora, froh, dies zu lesen, Happy Coding! – Shnugo

+0

Nun muss ich ur-Code verstehen und auch auf UGCOS anwenden, und dann in meine eigentliche Abfrage integrieren. Diese anfängliche Tabelle war eigentlich eine verbundene Tabelle aus mehreren Tabellen. lol. hoffe, es funktioniert. – Devora

1

Mit Kreuz Nehmen und Pivot können wir erreichen dieses

DECLARE @Table1 TABLE 
     (ID varchar(3), IC varchar(8), Name varchar(6), UGCOS varchar(9), MCOS varchar(7)) 
    ; 

    INSERT INTO @Table1 
     (ID , IC , Name , UGCOS , MCOS) 
    VALUES 
     ('1AA', 'A123456B', 'Edmund', 'Australia', 'Denmark'), 
     ('1AA', 'A123456B', 'Edmund', 'Australia', 'France'), 
     ('2CS', 'C435664C', 'Grace', 'Norway', NULL), 
     ('3TG', 'G885595H', 'Rae', NULL, 'Japan') 
    ; 
    Select ID , IC , Name , UGCOS,MAX([MCOS1])[MCOS1],MAX([MCOS2])[MCOS2] from (
    select ID , IC , Name , UGCOS , MCOS,col,val,col +''+CAST(ROW_NUMBER()OVER(PARTITION BY ID ORDER BY col) AS VARCHAR)RN from @Table1 
    CROSS APPLY (values('MCOS',MCOS))CS(col,val))T 
    PIVOT (MAX(val) FOR RN IN ([MCOS1],[MCOS2]))PVT 
    GROUP BY ID , IC , Name , UGCOS 
+0

Add' ('1AA', 'A123456B', 'Edmund ',' Australia ',' Russia '), '' 'Table1'' und' Russia' wird nicht angezeigt –

+0

SO fragte Frage, wie man dieses Ergebnis in PIVOT nach Ausgabe, die ich angegeben habe, zu bekommen.So wird nach seinen Daten ändern @RuslanK – mohan111

0

Haben Sie immer maximal 2 Reihen von Daten, die Sie in Spalten verwandeln? Wenn ja, würde dies dich tun;

CREATE TABLE #TableName (ID varchar(3), IC varchar(8), Name varchar(6), UCGOS varchar(9), MCOS varchar(7)) 
INSERT INTO #TableName 
VALUES 
('1AA','A123456B','Edmund','Australia','Denmark') 
,('1AA','A123456B','Edmund','Australia','France') 
,('2CS','C435664C','Grace','Norway',NULL) 
,('3TG','G885595H','Rae',NULL,'Japan') 

SELECT DISTINCT a.ID 
    ,a.IC 
    ,a.NAME 
    ,a.UCGOS 
    ,b.Mcos1 MCOS 
    ,c.Mcos2 MCOS1 
FROM #TableName a 
LEFT JOIN (
    SELECT ID 
     ,MAX(MCOS) Mcos1 
    FROM #TableName 
    GROUP BY ID 
    ) b ON a.ID = b.ID 
LEFT JOIN (
    SELECT ID 
     ,MIN(MCOS) Mcos2 
    FROM #TableName 
    GROUP BY ID 
    ) c ON a.ID = c.ID 
    AND (
     b.ID = c.ID 
     AND b.Mcos1 <> c.Mcos2 
     ) 

DROP TABLE #TableName 

Gibt Ihnen das Ergebnis, das Sie suchen.

+0

Nein reich, es wird dynamisch sein, was bedeutet, dass Edmund einen anderen MCOS in Japan haben könnte, und es sollte unter dem Spaltennamen 'MCSO2' erscheinen – Devora

2

Dies ist ein Vorschlag mit einem verkettete Ergebnis:

CREATE TABLE #tmpTbl (ID VARCHAR(100),IC VARCHAR(100),Name VARCHAR(100),UGCOS VARCHAR(100),MCOS VARCHAR(100)) 
INSERT INTO #tmpTbl VALUES 
('1AA','A123456B','Edmund','Australia','Denmark')  
,('1AA','A123456B','Edmund','Australia','France') 
,('2CS','C435664C','Grace','Norway',NULL)  
,('3TG','G885595H','Rae',NULL,'Japan'); 

SELECT ID,IC,Name,UGCOS, 
     (
     STUFF(
      (
      SELECT ' ,' + x.MCOS 
      FROM #tmpTbl AS x 
      WHERE x.ID=outerTbl.ID 
      FOR XML PATH('') 
     ),1,2,'' 
     ) 
     ) AS MCOS 
FROM #tmpTbl AS outerTbl 
GROUP BY ID,IC,Name,UGCOS; 
GO 
DROP TABLE #tmpTbl; 

Das Ergebnis

1AA A123456B Edmund Australia Denmark ,France 
2CS C435664C Grace Norway  NULL 
3TG G885595H Rae  NULL  Japan 
+0

Was ist der Zweck dieser Antwort genau für dieses Szenario ?? – mohan111

+0

Ja, er hatte in der Pivot-Abfrage nicht in der durch Komma getrennten Zeichenkette gefragt, die Sie oben angegeben haben – mohan111

+0

Sie sind in der Notwendigkeit, Reputation zu bekommen. Das ist möglicherweise der Grund, warum Sie sich selbst so ernst nehmen – mohan111