Podobné otázky jsou zde ,zde odpověděl v stackoverflow.
Musíte použít operátor PIVOT ve svém dotazu, abyste toho dosáhli. Zde je příklad a vysvětlení, jak to můžete udělat. Na příklad se odkazuje z toto zdroj.
---I assumed your tablename as TESTTABLE---
DECLARE @cols NVARCHAR(2000)
DECLARE @query NVARCHAR(4000)
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
SET @query = N'SELECT '+ @cols +' FROM
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p
PIVOT (MAX([Count]) FOR Name IN ( '+ @cols +' ))
AS pvt;'
EXECUTE(@query)
Vysvětlení
1. První část dotazu
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + t.Name
FROM TESTTABLE AS t
ORDER BY '],[' + t.Name
FOR XML PATH('')
), 1, 2, '') + ']'
vám poskytne pěkný sloučený výsledek hodnot sloupce Název v jednom řádku, jak je uvedeno níže
[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]
Další informace o STUFF a XML PATH najdete zde a zde .
2.SELECT + @cols + FROM
vybere všechny řádky jako názvy sloupců pro konečnou sadu výsledků (pvt - krok 3)
tj.
Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt]
3. Tento dotaz vytáhne všechny řádky dat, které potřebujeme k vytvoření výsledků křížových karet. Písmeno (p) za dotazem vytváří dočasnou tabulku výsledků, kterou lze poté použít ke splnění dotazu pro krok 1.
(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p
4. Výraz PIVOT
PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
provede skutečnou sumarizaci a vloží výsledky do dočasné tabulky nazvané pvt jako
Chery | Drew | Morgon | Kath | Kirk | Matt
-------------------------------------------
257 1500 13 500 200 76