2017-05-31 23 views
0

我有3個表A,B,C。像this將行值轉換爲動態列名稱並查找總量 - PIVOT

需要顯示一些SQL表結合這3個表(結果)的細節。 我需要動態顯示日期字段的值作爲列標題。 推薦此鏈接http://www.databasejournal.com/features/mssql/converting-rows-to-columns-pivot-and-columns-to-rows-unpivot-in-sql-server.html但它是用於靜態值。有沒有什麼辦法來實現這個動態數據。

在此先感謝

+0

因爲您似乎正在使用SQL Server,所以我刪除了MySQL標記。 –

+0

我是一個初學者,但如果我找到你的話,你想**不**在查詢中指定'C_date'列值(*在這個例子中是5個值),因爲這意味着查詢將會不適應新的價值(*例如31-05-2017),除非你更新它,對嗎?但是,他的文章是否已經通過'@ PivotColumns'覆蓋了這個內容? TBH我幾乎沒有掠過它,但那是我感覺到的。 – KtX2SkD

+0

c_date是一個日期時間字段,但我只想要日期.ie。,05-03-2017 ... – Shalu

回答

0

這應該工作

CREATE TABLE #A (A_ID INT, A_Name Varchar(100)) 
INSERT INTO #A VALUES (1,'X'),(2,'Y'),(3,'Z'); 

CREATE TABLE #B (B_ID INT,A_ID INT, B_Name Varchar(100)) 
INSERT INTO #B VALUES (10,1,'P'),(11,2,'Q'),(12,1,'R'); 

CREATE TABLE #C (B_ID INT,C_DATE DATE, C_QTY INT) 
INSERT INTO #C VALUES (10,'2017-01-01',100),(10,'2017-01-02',200), 
         (11,'2017-01-03',250),(11,'2017-01-03',50),(12,'2017-01-07',300); 
------------- PIVOT AS FOLLOWS      

DECLARE @Cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 
SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME(C_DATE) FROM #C 
    FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')  

SET @query = 'SELECT* FROM(
       SELECT 
       A.A_Name, 
       B.B_Name, 
       C.C_DATE, 
       C.C_QTY 
      FROM #A A 
      RIGHT JOIN #B B ON A.A_ID=B.A_ID 
      RIGHT JOIN #C C ON B.B_ID=C.B_ID 
       ) ABC 
PIVOT 
(
SUM(C_QTY) FOR [C_DATE] IN (' + @Cols + ') 

) AS PV1'; 

EXEC sp_executesql @query 

DROP TABLE #A; DROP TABLE #B;DROP TABLE #C 
+0

嘗試過,但c_date在結果表中爲空 – Shalu

+0

@Shalu,請澄清,我看到的唯一區別與您的圖片是:(1)具有NULL而不是空白,(2)缺少彙總所有日期的最後一列[結果],(3)不包含文本(Cdate)的[2017-01-01]列。這些是你關心的嗎?或者是別的什麼? – KtX2SkD

0

在與永源給以前的解決方案的關係,爲了與整體數量增加一個「結果」欄中的A_name和B_name我們可以創建總計視圖並將其添加到主查詢中

CREATE TABLE A (A_ID INT, A_Name Varchar(100)) 
INSERT INTO A VALUES (1,'X'),(2,'Y'),(3,'Z'); 

CREATE TABLE B (B_ID INT,A_ID INT, B_Name Varchar(100)) 
INSERT INTO B VALUES (10,1,'P'),(11,2,'Q'),(12,1,'R'); 

CREATE TABLE C (B_ID INT,C_DATE DATE, C_QTY INT) 
INSERT INTO C VALUES (10,'2017-01-01',100),(10,'2017-01-02',200), 
        (11,'2017-01-03',250),(11,'2017-01-03',50),(12,'2017-01-07',300); 

-- Create the view separately after having created the tables 
CREATE VIEW R_sum 
AS 
SELECT A.A_id, B.B_id, SUM(C.C_qty) AS Sum_qty 
FROM  A INNER JOIN 
        B ON A.A_id = B.A_id INNER JOIN 
        C ON B.B_id = C.B_id 
GROUP BY A.A_id, B.B_id 

------------- PIVOT AS FOLLOWS      

DECLARE @Cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 
SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME(C_DATE) FROM C 
    FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')  

SET @query = 'SELECT * FROM(
       SELECT 
       A.A_Name, 
       B.B_Name, 
       C.C_DATE, 
       C.C_QTY, 
       R.Sum_qty as Result 
      FROM A A 
      INNER JOIN B ON A.A_ID=B.A_ID 
      RIGHT JOIN C ON B.B_ID=C.B_ID 
      RIGHT JOIN R_Sum R ON B.A_ID=R.A_ID AND B.B_ID=R.B_ID 
       ) ABC 
PIVOT 
(
SUM(C_QTY) FOR [C_DATE] IN (' + @Cols + ') 

) AS PV1'; 

EXEC sp_executesql @query 
+0

顯示錯誤「關鍵字'DECLARE'附近的語法錯誤。」 – Shalu

+0

奇怪的是,我測試了它,它工作。你能否檢查表A,B和C以及視圖R_sum是否已經在數據庫中創建? –

+0

@Shalu,我可以通過將CREATE VIEW中的所有代碼運行到最後來解決這個錯誤,也許是這樣嗎?正確的用法直到「GROUP BY」,然後運行其餘的。無論如何,它與JonWay的輸出相同。 – KtX2SkD