我如何确定 3 个内部连接表中的数据以在一列上进行透视
How can i det data in 3 inner joined tables to pivot on one column
我有一个正在构建的大型查询,但要求它们旋转并显示所有分隔的行(按仓库)以按股票代码显示在单个行 () 中。以下是我的查询:
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
有什么建议吗?
听起来您需要将列反透视为行。正如另一位发帖人指出的那样,在没有示例数据或对数据库布局了解更多的情况下,提供一个可行的特定解决方案 'out of the box' 有点困难。话虽如此,这里是对使用 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 的工作原理。您可能需要稍微调整此脚本以满足您的需要。希望这可以帮助。
我有一个正在构建的大型查询,但要求它们旋转并显示所有分隔的行(按仓库)以按股票代码显示在单个行 () 中。以下是我的查询:
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
有什么建议吗?
听起来您需要将列反透视为行。正如另一位发帖人指出的那样,在没有示例数据或对数据库布局了解更多的情况下,提供一个可行的特定解决方案 'out of the box' 有点困难。话虽如此,这里是对使用 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 的工作原理。您可能需要稍微调整此脚本以满足您的需要。希望这可以帮助。