多表枢轴

cod*_*gle 5 sql-server pivot

我有几个表需要转换成一个新表。我肯定 (un)pivot 是解决问题的方法。但是,我不确定使用单个查询将多个表中的数据反透视为单个表的最佳方法是什么。

这些表大致如下所示:

销售:Pk、Year、Week1、Week2、Week3、...Week52

数量:Pk、Year、Week1、Week2、Week3、...Week52

订单:Pk、Year、Week1、Week2、Week3、...Week52

... 等等

我想要的是格式的表格

汇总表:Pk、Year_Week、销售额、数量、订单

我已经从上一个问题(使用 PIVOT 将单年列和多周列转换为单年/周列)中学到了如何为单个表执行此操作。大致如下所示:

SELECT Pk, Sales FROM (SELECT Pk, Wk1, Wk2, ..., Wk52 FROM Sales_Table) source UNPIVOT ( FOR Sales IN Wk1, Wk2, ..., Wk52 ) upt

如何在一个查询中为多个表执行此操作?

Jos*_*ira 5

我没有关于什么链接你的表的数据,所以你可能需要对 ON 子句做很少的改变,但这里是:

用数据创建表

CREATE TABLE #sales (PK int, Year int, Wk1 int, Wk2 int, Wk3 int, Wk4 int);
GO
INSERT INTO #sales VALUES (1,2012,9,5,3,4);
INSERT INTO #sales VALUES (2,2013,7,2,6,3);
INSERT INTO #sales VALUES (3,2014,6,5,6,1);
GO
CREATE TABLE #quantity (PK int, Year int, Wk1 int, Wk2 int, Wk3 int, Wk4 int);
GO
INSERT INTO #quantity VALUES (1,2012,14,54,13,49);
INSERT INTO #quantity VALUES (2,2013,8,12,17,31);
INSERT INTO #quantity VALUES (3,2014,16,25,25,3);
GO
CREATE TABLE #orders (PK int, Year int, Wk1 int, Wk2 int, Wk3 int, Wk4 int);
GO
INSERT INTO #orders VALUES (1,2012,2,5,3,9);
INSERT INTO #orders VALUES (2,2013,1,2,7,1);
INSERT INTO #orders VALUES (3,2014,1,5,5,2);
GO
Run Code Online (Sandbox Code Playgroud)

和查询:

SELECT PK, CAST(Year AS CHAR(4)) + '_' + Year_Week, Sales, Quantity, Orders
FROM
    (SELECT s.PK, s.Year
        , s.Wk1, s.Wk2, s.Wk3, s.Wk4
        , q.Wk1 AS qWk1, q.Wk2 AS qWk2, q.Wk3 AS qWk3, q.Wk4 AS qWk4
        , o.Wk1 AS oWk1, o.Wk2 AS oWk2, o.Wk3 AS oWk3, o.Wk4 AS oWk4
    FROM #sales s
    INNER JOIN #quantity q ON s.PK = q.PK AND s.YEAR = q.YEAR
    INNER JOIN #orders o ON s.PK = o.PK AND s.YEAR = o.YEAR) p
UNPIVOT
    (Sales FOR Year_Week IN
        (Wk1, Wk2, Wk3, Wk4)
    )AS unpvt_s
UNPIVOT
    (Quantity FOR Year_Week_q IN
        (qWk1, qWk2, qWk3, qWk4)
    )AS unpvt_q
UNPIVOT
    (Orders FOR Year_Week_o IN
        (oWk1, oWk2, oWk3, oWk4)
    )AS unpvt_o
WHERE 'q'+Year_Week = Year_Week_q
    AND 'o'+Year_Week = Year_Week_o;
GO
Run Code Online (Sandbox Code Playgroud)