/ / Riadky do stĺpcov v SQL SERVEROVOM VYUŽITÍ PIVOT príkazu (Nahradenie NULL hodnôt na 0 a zobrazenie súčtu všetkých hodnôt) - sql, sql-server

Riadky na stĺpce v SQL SERVER POUŽITIE PIVOT príkazu (Nahradenie hodnôt NULL do 0 a zobrazenie sumy všetkých hodnôt) - sql, sql-server

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ť.

  1. Nahrádza NULL na 0 vo všetkých stĺpcoch
  2. 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)

tu zadajte popis obrázku

odpovede:

2 pre odpoveď č. 1

Ná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,"")