2016-04-28 17 views
5

ho la tabella qui sotto. (nessuna chiave primaria in questa tabella)Utilizzare la query Dyamic Pivot per questo?

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  

Ho bisogno di ottenere il risultato in questo modo.

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

Ho cercato su Google e sembra che PIVOT sia ciò che ho bisogno di fare. Tuttavia non sono sicuro di come possa essere implementato sui miei tavoli. Sarebbe un grande aiuto se qualcuno mi potesse aiutare. Grazie!

+0

Avete bisogno di colonne dedicate in uscita (come 'MCO, MCOS1, MCOS2 ...')? C'è un limite superiore? Woudl un risultato concatenato in una singola colonna (come 'MCOS' che contiene' Danimarca, Francia' adatta anche alle tue esigenze? – Shnugo

+1

Perché non 'Francia | Danimarca?? – Strawberry

+0

@Shnugo Sì, ci saranno MCOS, MCOS1, MCOS2 ecc senza limite superiore Non riesco a fare risultato concatenato, devo dividere le colonne – Devora

risposta

2

creerò una seconda risposta, in quanto questo approccio è qualcosa di completamente diverso dal mio primo:

Questa query dinamica trova innanzitutto il conteggio massimo di un ID distinto e quindi crea un perno dinamico

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; 

Il risultato

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

Funziona @ Shnugo GRAZIE! – Devora

+0

@Devora, felice di leggere questo, Happy Coding! – Shnugo

+0

Ora ho bisogno di capire il codice ur e applicare anche a UGCOS, e quindi integrarlo nella mia domanda reale. Quella tabella iniziale era in realtà una tabella unita da tabelle multiple. lol. spero funzioni. – Devora

1

Utilizzando Croce Applicare e Pivot possiamo raggiungere questo

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

Aggiungi '('1AA', 'A123456B', 'Edmund ',' Australia ',' Russia '), 'a' @ Tabella1' e 'Russia' non saranno mostrati –

+0

SO domanda posta come ottenere quel risultato impostato in PIVOT come da Output che ho dato. Così modificherà secondo i suoi Dati @RuslanK. – mohan111

0

Avete sempre un massimo di 2 righe di dati che si desidera trasformare in colonne? Se è così, questo ti farebbe;

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 

Ti dà il risultato che cerchi.

+0

Non ricco, sarà dinamico. Ciò significa che Edmund potrebbe avere un altro MCOS in Giappone e dovrebbe apparire sotto il nome della colonna "MCSO2" – Devora

2

Questo è un suggerimento con un risultato concatenato:

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; 

Il risultato

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

qual è lo scopo di questa risposta esattamente per questo scenario – mohan111

+0

Sì, aveva chiesto nella query Pivot non in una stringa separata da virgole che hai indicato sopra – mohan111

+0

che hai un disperato bisogno di ottenere la reputazione. Questo potrebbe essere il motivo per cui ti stai prendendo in giro così seriamente – mohan111

Problemi correlati