如何在3个内部连接表中删除数据以在一列上进行旋转

时间:2016-01-28 19:30:26

标签: sql sql-server-2008 pivot

我有一个大型查询,我正在构建,但要求它们转动并显示所有分隔的行(按仓库),以显示在股票代码的单数行()中。以下是我的疑问:

SELECT DISTINCT RTRIM(IMB.StockCode) StockCode
, IM.Description
, IM.CostUom
, IM.StockOnHold
, IV.LastCostEntered
, IV.UnitCost
, IV.Warehouse
, IM.Supplier
, IM.StockUom
, IM.AlternateUom
, IM.OtherUom
FROM InvMultBin IMB
INNER JOIN InvMaster IM ON IMB.StockCode=IM.StockCode
    INNER JOIN InvWarehouse IV ON IV.StockCode=IMB.StockCode
WHERE IMB.LastIssueDate >GETDATE()-YEAR(1) AND IV.Warehouse LIKE '%'
ORDER BY StockCode

然后这就是它产生的东西(至少前15行):

StockCode   Description CostUom StockOnHold LastCostEntered UnitCost    Warehouse   Supplier    StockUom    AlternateUom    OtherUom
AF0006  No 8 Fomopak                    125     38.06750    38.06750     C1 0001255 125 500 125
AF0006  No 8 Fomopak                    125     39.27750    39.27750    P1  0001255 125 500 125
AF0006  No 8 Fomopak                    125     38.06000    38.06000    D1  0001255 125 500 125
AF0006  No 8 Fomopak                    125     38.06750    38.06750    J1  0001255 125 500 125
AF0006  No 8 Fomopak                    125     39.27750    39.13500    G1  0001255 125 500 125
AF0009  No 34 Fomopak                   125     56.92250    79.34897    G1  0001255 125 125 125
AF0009  No 34 Fomopak                   125     56.38000    56.75328    C1  0001255 125 125 125
AF0011  No 65S Fomopak                  375     61.42000    60.37000    B1  0001255 375 375 375
AF0011  No 65S Fomopak                  375     61.41000    60.46750    D1  0001255 375 375 375
AF0011  No 65S Fomopak                  375     59.52000    59.52000    C1  0001255 375 375 375
AF0011  No 65S Fomopak                  375     61.41750    60.06794    P1  0001255 375 375 375
AF0011  No 65S Fomopak                  375     61.41750    61.41750    G1  0001255 375 375 375
AF0011  No 65S Fomopak                  375     53.62000    53.62000    T1  0001255 375 375 375
AF0011  No 65S Fomopak                  375     61.41000    61.41000    J1  0001255 375 375 375
AF0012  No 69 Fomopak                   250     140.76500   140.76500   G1  0001255 250 250 250

我需要它按列显示如下:

StockCode
Description
CostUom
StockOnHold
LastCostEntered
UnitCost
B1
C1
D1
G1
J1
M1
P1
T1
Supplier
StockUom
AlternateUom
OtherUom

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

听起来你需要将列UNPIVOT成行。正如另一张海报指出的那样,如果没有样本数据或了解有关数据库布局的更多信息,那么提供“开箱即用”的特定解决方案有点困难。话虽如此,这里有一个关于如何使用UNPIVOT可能会在最终实现中看到的内容。

    WITH UNPIV_CTE
    AS
    (
    SELECT DISTINCT RTRIM(IMB.StockCode) StockCode
    , IM.Description
    , IM.CostUom
    , IM.StockOnHold
    , IV.LastCostEntered
    , IV.UnitCost
    , IV.Warehouse
    , IM.Supplier
    , IM.StockUom
    , IM.AlternateUom
    , IM.OtherUom
    FROM InvMultBin IMB
    INNER JOIN InvMaster IM ON IMB.StockCode=IM.StockCode
        INNER JOIN InvWarehouse IV ON IV.StockCode=IMB.StockCode
    WHERE IMB.LastIssueDate >GETDATE()-YEAR(1) AND IV.Warehouse LIKE '%'
    )
-- Start of UNPIVOT
    SELECT u.StockCode, u.Column_Names, u.Column_Values
    FROM UNPIV_CTE UnP
-- Two new columns created with self explanatory names.  
    UNPIVOT ( Column_Values FOR Column_Names IN ([Description]
    , CostUom
    , StockOnHold
    , LastCostEntered
    , UnitCost
    , Warehouse
    , Supplier
    , StockUom
    , AlternateUom
    , OtherUom )
    ) u
    ORDER BY u.StockCode DESC
    ;

它使用您的确切查询,但包含在CTE中,以便更容易查看UNPIVOT的工作原理。您可能需要稍微调整此脚本以满足您的需求。希望这可以帮助。