SQL UNPIVOT 协助
SQL UNPIVOT assistance
我有一个查询,其中 returns 来自两个表的大量列;一个有本周初的订单,一个有今天的订单。然后我将每周订单与每日订单进行比较,看看是否有任何差异。
SELECT
*,
CASE
WHEN w.[DueDate] != d.[DueDate]
THEN 'Due Date'
WHEN w.[ItemCode] != d.[ItemCode]
THEN 'ItemCode'
WHEN w.[PlannedQty] != d.[PlannedQty]
THEN 'Planned Qty'
END [Discrepancy]
FROM
(SELECT
'Daily' [Period],
*
FROM
DailyProduction) d
LEFT JOIN
(SELECT
'Weekly' [Period],
*
FROM
WeeklyProduction) w ON w.[DocNum] = d.[DocNum]
其中 returns 类似于:
太棒了。
但是我想将 Daily 与 Weekly 结果分开,将它们放在单独的行中,同时还保持两个新行的差异 列。
像这样
我认为我需要使用 UNPIVOT
,但过去 2 个多小时我一直在阅读相关问题/博客,但无法弄清楚它是如何工作的。
只是 运行 一个 UNION
查询,仅从 FROM/JOIN
子句中的特定 table 选择字段:
SELECT
'Daily' AS [Period],
d.Status, d.DocNum, d.ProductionDate, d.DueDate, d.Week,
d.DueDay, d.ItemCode, d.PlannedQty,
CASE
WHEN w.[DueDate] != d.[DueDate]
THEN 'Due Date'
WHEN w.[ItemCode] != d.[ItemCode]
THEN 'ItemCode'
WHEN w.[PlannedQty] != d.[PlannedQty]
THEN 'Planned Qty'
END [Discrepancy]
FROM
DailyProduction d
LEFT JOIN
WeeklyProduction w ON w.[DocNum] = d.[DocNum]
UNION ALL
SELECT
'Weekly' AS [Period],
w.Status, w.DocNum, w.ProductionDate, w.DueDate, w.Week,
w.DueDay, w.ItemCode, w.PlannedQty,
CASE
WHEN w.[DueDate] != d.[DueDate]
THEN 'Due Date'
WHEN w.[ItemCode] != d.[ItemCode]
THEN 'ItemCode'
WHEN w.[PlannedQty] != d.[PlannedQty]
THEN 'Planned Qty'
END [Discrepancy]
FROM
DailyProduction d
LEFT JOIN
WeeklyProduction w ON w.[DocNum] = d.[DocNum]
我有一个查询,其中 returns 来自两个表的大量列;一个有本周初的订单,一个有今天的订单。然后我将每周订单与每日订单进行比较,看看是否有任何差异。
SELECT
*,
CASE
WHEN w.[DueDate] != d.[DueDate]
THEN 'Due Date'
WHEN w.[ItemCode] != d.[ItemCode]
THEN 'ItemCode'
WHEN w.[PlannedQty] != d.[PlannedQty]
THEN 'Planned Qty'
END [Discrepancy]
FROM
(SELECT
'Daily' [Period],
*
FROM
DailyProduction) d
LEFT JOIN
(SELECT
'Weekly' [Period],
*
FROM
WeeklyProduction) w ON w.[DocNum] = d.[DocNum]
其中 returns 类似于:
太棒了。
但是我想将 Daily 与 Weekly 结果分开,将它们放在单独的行中,同时还保持两个新行的差异 列。
像这样
我认为我需要使用 UNPIVOT
,但过去 2 个多小时我一直在阅读相关问题/博客,但无法弄清楚它是如何工作的。
只是 运行 一个 UNION
查询,仅从 FROM/JOIN
子句中的特定 table 选择字段:
SELECT
'Daily' AS [Period],
d.Status, d.DocNum, d.ProductionDate, d.DueDate, d.Week,
d.DueDay, d.ItemCode, d.PlannedQty,
CASE
WHEN w.[DueDate] != d.[DueDate]
THEN 'Due Date'
WHEN w.[ItemCode] != d.[ItemCode]
THEN 'ItemCode'
WHEN w.[PlannedQty] != d.[PlannedQty]
THEN 'Planned Qty'
END [Discrepancy]
FROM
DailyProduction d
LEFT JOIN
WeeklyProduction w ON w.[DocNum] = d.[DocNum]
UNION ALL
SELECT
'Weekly' AS [Period],
w.Status, w.DocNum, w.ProductionDate, w.DueDate, w.Week,
w.DueDay, w.ItemCode, w.PlannedQty,
CASE
WHEN w.[DueDate] != d.[DueDate]
THEN 'Due Date'
WHEN w.[ItemCode] != d.[ItemCode]
THEN 'ItemCode'
WHEN w.[PlannedQty] != d.[PlannedQty]
THEN 'Planned Qty'
END [Discrepancy]
FROM
DailyProduction d
LEFT JOIN
WeeklyProduction w ON w.[DocNum] = d.[DocNum]