SELECT Name1, Name2, Value FROM mytable
mi dà il seguente set di risultati:SQL Server PIVOT forse?
Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1
Come traduco quello a:
A B P1 1 4 P2 1 1 P3 2 null P4 null 1
Grazie,
SELECT Name1, Name2, Value FROM mytable
mi dà il seguente set di risultati:SQL Server PIVOT forse?
Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1
Come traduco quello a:
A B P1 1 4 P2 1 1 P3 2 null P4 null 1
Grazie,
È possibile utilizzare una clausola PIVOT. La query potrebbe essere qualcosa di simile:
WITH Source as (
SELECT Name1, Name2, [Value]
FROM mytable
)
SELECT Name2, CASE WHEN A IS NOT NULL THEN A ELSE 'your string' END As A
, CASE WHEN B IS NOT NULL THEN B ELSE 'your string' END As B
FROM (
SELECT Name2, Name1, [Value]
FROM Source
) s
PIVOT
(
MAX([Value]) FOR Name1 IN (A, B) -- any other Name1 would go here
) p
utilizzando i dati di esempio sopra, i miei risultati sono stati
P1 1 3
P2 1 1
P3 2 your string
P4 your string 1
EDIT:
Dal momento che si dispone di un numero imprecisato di colonne, sarà necessario guarda utilizzando SQL dinamico e ci sono diverse risposte qui su SO su quello con PIVOT.
Il problema è che l'OP non può limitare l'output a A, B. Potrebbe anche esserci C, ..., X, come indicato in uno dei commenti. –
Ho apportato alcune modifiche e sono riuscito a farlo funzionare utilizzando questo esempio e http://stackoverflow.com/questions/159456/pivot-table-and-concatenate-columns-sql-problem#159803. Un'ultima cosa, come andrei a sostituire i NULL con un'altra stringa. Ho provato un CASE ma sostituisce solo i campi 'Value' che hanno valori, non i NULL – user683302
Ho aggiornato la query PIVOT sopra usando CASE e cambia i valori NUll in una stringa. – Taryn
Non ho SQL Server in esecuzione qui al lavoro, quindi questo non può, mediante completamente sintatticamente corretta, ma un approccio sarebbe tabulazione incrociata
SELECT name2
, SUM(CASE WHEN name1 = 'A' THEN value END) AS A
, SUM(CASE WHEN name1 = 'B' THEN value END) AS B
FROM table
GROUP BY name2
per numero variabile di colonne è possibile utilizzare SQL dinamico:
DECLARE @sql varchar(max)
SELECT @sql = COALESCE(@sql+',','') + 'SUM(CASE WHEN nane1 = '''+name1+''' THEN value END) AS ['+name1']' FROM table
SET @sql = 'SELECT name2, '[email protected]+' FROM table GROUP BY name2'
EXEC(@sql)
Tisk, tisk ... rispondendo alle domande SO al lavoro =) – jadarnel27
Stavo aspettando la compilazione del mio codice :-P – Zugwalt
Ci sono molti [più costruttivi] (http: // xkcd.com/303/) cose che puoi fare mentre il tuo codice è in fase di compilazione;) Ho postato quel commento mentre ero al lavoro pure haha – jadarnel27
Dal momento che si utilizza SQL Server 2005, ecco il codice:
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF((SELECT distinct ',' + QuoteName([Name1])
FROM myTable FOR XML PATH('')), 1, 1, '')
SET @sqlquery = 'SELECT * FROM
(SELECT Name2, Name1, Value
FROM myTable) base
PIVOT (Sum(Value) FOR [Name1]
IN (' + @cols + ')) AS finalpivot'
EXECUTE (@sqlquery)
Questo funziona indipendentemente dal numero di status diverso che avete. Assembla dinamicamente una query con PIVOT
. L'unico modo per eseguire PIVOT con colonne dinamiche è assemblare la query in modo dinamico, operazione che può essere eseguita in SQL Server.
Altri esempi:
+1 per 'QuoteName' –
@Martin Evita gli attacchi di iniezione! –
+1 Sono solo senza parole. –
Hi @user! Che DBMS stai usando? – jadarnel27
A e B sono un elenco fisso di costanti? – Neil
@ jadarnel27 - C'è un suggerimento nel titolo della domanda;) – Tony