我有3個表A,B,C。像將行值轉換爲動態列名稱並查找總量 - PIVOT
需要顯示一些SQL表結合這3個表(結果)的細節。 我需要動態顯示日期字段的值作爲列標題。 推薦此鏈接http://www.databasejournal.com/features/mssql/converting-rows-to-columns-pivot-and-columns-to-rows-unpivot-in-sql-server.html但它是用於靜態值。有沒有什麼辦法來實現這個動態數據。
在此先感謝
我有3個表A,B,C。像將行值轉換爲動態列名稱並查找總量 - PIVOT
需要顯示一些SQL表結合這3個表(結果)的細節。 我需要動態顯示日期字段的值作爲列標題。 推薦此鏈接http://www.databasejournal.com/features/mssql/converting-rows-to-columns-pivot-and-columns-to-rows-unpivot-in-sql-server.html但它是用於靜態值。有沒有什麼辦法來實現這個動態數據。
在此先感謝
這應該工作
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
在與永源給以前的解決方案的關係,爲了與整體數量增加一個「結果」欄中的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
因爲您似乎正在使用SQL Server,所以我刪除了MySQL標記。 –
我是一個初學者,但如果我找到你的話,你想**不**在查詢中指定'C_date'列值(*在這個例子中是5個值),因爲這意味着查詢將會不適應新的價值(*例如31-05-2017),除非你更新它,對嗎?但是,他的文章是否已經通過'@ PivotColumns'覆蓋了這個內容? TBH我幾乎沒有掠過它,但那是我感覺到的。 – KtX2SkD
c_date是一個日期時間字段,但我只想要日期.ie。,05-03-2017 ... – Shalu