2

Sql Server で行を列に表示したい。他の質問を見てきましたが、これらの列はピボットでハードコーディングされていますが、私の列は動的になります。私がこれまでに達成したこと。スクリーンショットに示されているように、行を列に変換することはできますが、達成できないことはほとんどありません..あなたのガイズの助けが必要です

  1. すべての列で NULL を 0 に置き換える
  2. companyID を除くすべての列の合計を表示する列を 1 つ追加する必要があります

私の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)

ここに画像の説明を入力

4

1 に答える 1

2

次のように、動的ピボットの列名などを変更できます。

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)

クエリを作成し、最初に列を機能させてから、データを #temp テーブルに追加することをお勧めします。その方法でデバッグする方が簡単です。

SUM()同じ方法でフィールドを作成することもできます。ここでは、動的に構築してから final に追加しSELECTます。

したがって、 final に追加できるのは次のようなものです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,'')
于 2012-09-21T10:37:11.447 に答える