簡體   English   中英

SQL Server 2005 - 動態PIVOT查詢

[英]SQL Server 2005 - Dynamic PIVOT query

我需要你對PIVOT查詢問題的幫助。 情景是我有一個投票系統。 包括3個表格。 選舉,候選人,投票。

樞軸涉及PIVOTing候選名稱作為列和具有VOTE數據作為數據。

到目前為止,我已經嘗試了這個並沒有讓它工作,我已經陷入困境:(

CREATE TABLE  #MYELECTIONS (E_POSITION_CODE INT, E_POSITIONNAME VARCHAR(50))
    INSERT INTO #MYELECTIONS VALUES (147,'MANAGER')
    INSERT INTO #MYELECTIONS VALUES (148,'CHEF')
    INSERT INTO #MYELECTIONS VALUES (149,'WAITER')

CREATE TABLE  #MYCANDIDATES (C_CANDIDATE_CODE INT, 
                          C_CANDIDATENAME VARCHAR (50), C_POSITION_CODE INT)
INSERT INTO #MYCANDIDATES VALUES (100,'TOM CRUISE', 147)
INSERT INTO #MYCANDIDATES VALUES (101,'MICKY MOUSE', 147)
INSERT INTO #MYCANDIDATES VALUES (103,'DONALD DUCK', 147)
INSERT INTO #MYCANDIDATES VALUES (100,'TOM CRUISE', 148)

CREATE TABLE  #MYVOTES (V_POSITION_CODE INT, 
                        V_CANDIDATE_CODE INT, VOTINGPREFERENCE SMALLINT)
INSERT INTO #MYVOTES VALUES (147,100,1)
INSERT INTO #MYVOTES VALUES (147,100,1)
INSERT INTO #MYVOTES VALUES (147,100,1)
INSERT INTO #MYVOTES VALUES (147,100,1)
INSERT INTO #MYVOTES VALUES (147,101,1)
INSERT INTO #MYVOTES VALUES (147,101,1)
INSERT INTO #MYVOTES VALUES (147,103,1)
INSERT INTO #MYVOTES VALUES (148,100,1)
INSERT INTO #MYVOTES VALUES (148,100,1)

DECLARE @DynamicPivotQuery  AS NVARCHAR(MAX)
DECLARE @ColumnName         AS NVARCHAR(MAX)

DECLARE @MyPositionCode     AS INT
SET @MyPositionCode = 147

DECLARE @MyOutput           AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',','') 
                + QUOTENAME(C_CANDIDATENAME)

FROM (SELECT TOP 100 PERCENT C_CANDIDATENAME 
    FROM #MYCANDIDATES 
    WHERE C_POSITION_CODE = @MyPositionCode 
    ORDER BY C_CANDIDATE_CODE) AS C_CANDIDATENAME


--Prepare the `PIVOT` query using the dynamic sql
SET @DynamicPivotQuery = 
  N'SELECT  ROW_NUMBER() OVER (ORDER BY E_POSITIONNAME) AS Idnum,    
  E_POSITIONNAME AS [Position Name], ' + @ColumnName + '
  FROM  #MYVOTES 
  INNER JOIN #MYELECTIONS 
  ON (#MYVOTES.V_POSITION_CODE = #MYELECTIONS.E_POSITION_CODE)
    PIVOT(SUM(VOTINGPREFERENCE))
      FOR C_CANDIDATENAME IN (' + @ColumnName + ') AS PVTTable
  WHERE #MYELECTIONS.E_POSITION_CODE = 147'

--Execute the Dynamic Pivot Query
EXEC sp_executesql  @DynamicPivotQuery, 
                    @MyOutput = @MyOutput OUTPUT

SELECT @MyOutput

DROP TABLE #MYELECTIONS
DROP TABLE #MYCANDIDATES
DROP TABLE #MYVOTES

它是一個動態的PIVOT作為候選名稱,我想Pivot欄目,可能取決於有多少考生有一個選舉的位置是動態的。

以上所需的輸出如下: -

選舉@MyPositionCode = 147

Idnum   Position_Name   TOM CRUISE  MICKY MOUSE  DONALD DUCK...

1       MANAGER         4           2            1           

選舉@MyPositionCode = 148

Idnum   Position_Name   TOM CRUISE  MICKY MOUSE  DONALD DUCK...

1       CHEF            2           0            0

嘗試這個

DECLARE @MyPositionCode     AS INT
SET @MyPositionCode = 147

聲明用於選擇動態列的變量

DECLARE @DynamicPivotQuery  AS NVARCHAR(MAX)
DECLARE @ColumnName         AS NVARCHAR(MAX)


DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + C_CANDIDATENAME + ']', '[' + C_CANDIDATENAME + ']')
               FROM    
               (
                    SELECT TOP 100 PERCENT C_CANDIDATENAME 
                    FROM #MYCANDIDATES 
                    WHERE C_POSITION_CODE = @MyPositionCode 
                    ORDER BY C_CANDIDATE_CODE
                ) PV 
               ORDER BY C_CANDIDATENAME desc

如果要將NULL替換為NULL

DECLARE @NulltoZeroCols NVARCHAR (MAX)

SELECT @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+C_CANDIDATENAME+'],0) AS ['+C_CANDIDATENAME+']' 
FROM 
(
    SELECT TOP 100 PERCENT C_CANDIDATENAME 
    FROM #MYCANDIDATES 
    WHERE C_POSITION_CODE = @MyPositionCode 
    ORDER BY C_CANDIDATE_CODE
)TAB  
ORDER BY C_CANDIDATENAME desc FOR XML PATH('')),2,8000)

現在動態轉動它。 我在里面寫了邏輯

DECLARE @query NVARCHAR(MAX)
SET @query = '-- You can apply ROW_NUMBER() here which is the data after pivot 
              SELECT ROW_NUMBER() OVER (ORDER BY E_POSITIONNAME) AS Idnum,
              ,E_POSITIONNAME,'+@NullToZeroCols+'  
              FROM 
             (           
                -- Select data before pivot      
                SELECT  TOP 100 PERCENT ME.E_POSITIONNAME,MC.C_CANDIDATENAME,
                COUNT(MC.C_CANDIDATENAME) OVER(PARTITION BY ME.E_POSITIONNAME,MC.C_CANDIDATENAME) CNT
                FROM #MYELECTIONS ME
                JOIN #MYCANDIDATES MC ON ME.E_POSITION_CODE=MC.C_POSITION_CODE
                JOIN #MYVOTES MV ON MC.C_CANDIDATE_CODE=MV.V_CANDIDATE_CODE
                AND MV.V_POSITION_CODE=MC.C_POSITION_CODE
                WHERE MC.C_POSITION_CODE = ' + CAST(@MyPositionCode AS VARCHAR(30)) + '
             ) x
             PIVOT 
             (
                 MIN(CNT)
                 FOR C_CANDIDATENAME IN (' + @cols + ')
            ) p
            ;' 

EXEC SP_EXECUTESQL @query

點擊以下鏈接。 如果結果未自動生成,請按RUN QUERY按鈕。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM