Chcem zobraziť riadky do stĺpcov na serveri Sql. Videl som ďalšie otázky, ale tieto stĺpce sú pevne zakódované na konci, ale stĺpce budú dynamické. Čo som doteraz dosiahol. Ako je znázornené na snímke obrazovky, dokážem konvertovať riadky do stĺpcov, ale pár vecí, ktoré nedokážem splniť.
- Nahrádza NULL na 0 vo všetkých stĺpcoch
- Je potrebné pridať ďalší stĺpec, v ktorom sa zobrazí súčet všetkých stĺpcov s výnimkou identifikátora companyID
Môj kód SQL:
DECLARE @Columns VARCHAR(MAX)
DECLARE @Convert VARCHAR(MAX)
SELECT @Columns = STUFF((
SELECT "],[" + ErrClassfn
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY "],[" + CONVERT(VARCHAR(MAX), ID) ASC
FOR
XML PATH("")
), 1, 2, "") + "]"
SET @Convert = "SELECT * INTO #mynewTable FROM
(
SELECT COUNT(WQ.ErrClassfnID) as ErrorCount, UPPER(WQ.CompanyID) as CompanyID,
PME.ErrClassfn as ErrorName
FROM Version25.dbo.WF_Quality AS WQ
LEFT JOIN ArchimedesTables.dbo.PM_ErrClassificationSetup as PME
ON WQ.ErrClassfnID = PME.ID
GROUP BY
UPPER(CompanyID), ErrClassfn
) Quality PIVOT ( SUM(ErrorCount) For ErrorName IN (" + @Columns
+ ")) as PivotTable SeLeCt * FROM #mynewTable"
EXEC(@Convert)
odpovede:
2 pre odpoveď č. 1Názvy stĺpcov atď. Môžete zmeniť pre dynamický pivot, podobne ako v tomto prípade:
DECLARE @ColumnsNull VARCHAR(MAX)
DECLARE @Columns VARCHAR(MAX)
DECLARE @Convert VARCHAR(MAX)
SELECT @ColumnsNull = STUFF((SELECT ", IsNull(" + QUOTENAME(ErrClassfn) +", 0) as ["+ rtrim(ErrClassfn)+"]"
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY ID ASC
FOR XML PATH(""), TYPE
).value(".", "NVARCHAR(MAX)")
,1,1,"")
SELECT @Columns = STUFF((
SELECT "],[" + ErrClassfn
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY "],[" + CONVERT(VARCHAR(MAX), ID) ASC
FOR
XML PATH("")
), 1, 2, "") + "]"
SET @Convert = "SELECT CompanyID, "+ @ColumnsNull + "
INTO #mynewTable
FROM
(
SELECT COUNT(WQ.ErrClassfnID) as ErrorCount, UPPER(WQ.CompanyID) as CompanyID,
PME.ErrClassfn as ErrorName
FROM Version25.dbo.WF_Quality AS WQ
LEFT JOIN ArchimedesTables.dbo.PM_ErrClassificationSetup as PME
ON WQ.ErrClassfnID = PME.ID
GROUP BY
UPPER(CompanyID), ErrClassfn
) Quality PIVOT ( SUM(ErrorCount) For ErrorName IN (" + @Columns
+ ")) as PivotTable SeLeCt * FROM #mynewTable"
EXEC(@Convert)
Radil by som napísať dotaz a uviesť stĺpce do prevádzky ako prvé, potom pridať údaje do tabuľky #temp. Bude jednoduchšie ladiť týmto spôsobom.
Môžete tiež vytvoriť SUM()
rovnakým spôsobom, kde ho dynamicky zostavujete a potom ho pridáte do finále SELECT
:
Takže by to mohlo byť niečo také, čo by ste mohli pridať do finále SELECT
:
SELECT @ColumnsTotal = STUFF((SELECT "+" + QUOTENAME(ErrClassfn)
from ArchimedesTables.dbo.PM_ErrClassificationSetup
WHERE CONVERT(VARCHAR(10), ISNULL(EndDate, GETDATE()), 101)
Between CONVERT(VARCHAR(10), GETDATE(), 101)
AND CONVERT(VARCHAR(10), GETDATE(), 101)
ORDER BY ID ASC
FOR XML PATH(""), TYPE
).value(".", "NVARCHAR(MAX)")
,1,1,"")