sql >> Databáze >  >> RDS >> Sqlserver

Jak převedu řádky na sloupce na serveru SQL Server 2005

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


  1. Zend_Db seřaďte podle pole Hodnota

  2. Fulltextový dotaz s jedinou uvozovkou

  3. Je substr nebo LIKE rychlejší v Oracle?

  4. Existuje nějaké zvýšení výkonu při indexování booleovského pole?