sql-server - SQL Server:UNION,包含数据的列,删除没有的列
问题描述
我有两张桌子,LYEAR
并且CYEAR
:
[SKU],[Title],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]
列[SKU],[Title],[1],[2],[3],[4],[5],[6],[7],[8]
填充有来自表格CYEAR
和表格的信息。 [SKU],[Title],[9],[10],[11],[12]
LYEAR
我将如何合并这两个表,以便删除具有 NULL 值的列,让每个 SKU 留有一行?
我已经做到了这一点:
WITH LYEAR_ORG ([SKU],[Title],[QTY],[DATE]) AS
(
SELECT
T1.ItemNumber, T1.ItemTitle, (SUM(T2.nqty)) AS [UNITS],
CONVERT(VARCHAR(2), (MONTH(T3.dProcessedOn)))
FROM
StockItem T1
LEFT OUTER JOIN
OrderItem T2 ON T1.pkstockItemId = T2.fkStockItemID_processed
LEFT JOIN
[Order] T3 ON T3.pkOrderID = T2.fkOrderID
WHERE
(YEAR(T3.dProcessedOn)) = (YEAR(getdate())-1)
AND (MONTH(T3.dProcessedOn)) > (MONTH(getdate())-1)
GROUP BY
T1.ItemNumber, T1.ItemTitle,
CONVERT(VARCHAR(2), (MONTH(T3.dProcessedOn)))
),
CYEAR_ORG ([SKU],[Title],[QTY],[DATE]) AS
(
SELECT T1.ItemNumber, T1.ItemTitle, (SUM(T2.nqty)) AS [UNITS], CONVERT(varchar(2),(MONTH(T3.dProcessedOn)))
FROM StockItem T1
LEFT OUTER JOIN OrderItem T2 ON T1.pkstockItemId = T2.fkStockItemID_processed
LEFT JOIN [Order] T3 ON T3.pkOrderID = T2.fkOrderID
WHERE (YEAR(T3.dProcessedOn)) = (YEAR(getdate())-1)
AND (MONTH(T3.dProcessedOn)) < (MONTH(getdate()))
GROUP BY T1.ItemNumber, T1.ItemTitle, CONVERT(varchar(2),(MONTH(T3.dProcessedOn)))
),
LYEAR ([SKU],[Title],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) AS (
SELECT *
FROM LYEAR_ORG
PIVOT ( MAX(QTY) FOR DATE in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) as LYEAR_ORDERS
),
CYEAR ([SKU],[Title],[1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) AS (
SELECT *
FROM CYEAR_ORG
PIVOT ( MAX(QTY) FOR DATE in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) as CYEAR_ORDERS
)
SELECT * FROM LYEAR
UNION ALL
SELECT * FROM CYEAR
我无法使用INSERT INTO
,因为这是我正在使用的 Linnworks 平台的限制,它是 SQL Server。
解决方案
假设 LYEAR 列 1-8 全部为 NULL,CYEAR 9-12 也是如此,JOIN
带有大量COALESCE
s 的 a 而不是 aUNION
会让你到达你想去的地方。但是,如果任何列中都有这两年的值,那么这将是横向的。
SELECT
l.[SKU]
,l.[Title]
,COALESCE(l.[1], c.[1]) AS [1]
,COALESCE(l.[2], c.[2]) AS [2]
,COALESCE(l.[3], c.[3]) AS [3]
,COALESCE(l.[4], c.[4]) AS [4]
,COALESCE(l.[5], c.[5]) AS [5]
,COALESCE(l.[6], c.[6]) AS [6]
,COALESCE(l.[7], c.[7]) AS [7]
,COALESCE(l.[8], c.[8]) AS [8]
,COALESCE(l.[9], c.[9]) AS [9]
,COALESCE(l.[10], c.[10]) AS [10]
,COALESCE(l.[11], c.[11]) AS [11]
,COALESCE(l.[12], c.[12]) AS [12]
FROM
LYEAR AS l
JOIN
CYEAR AS c
ON
c.SKU = l.SKU
AND c.Title = l.Title;
推荐阅读
- python - 在 TensorFlow 中配置 GPU 内存使用情况
- xml - XML 枚举值接受空值
- php - 如何创建一个视图来显示 Laravel 中的所有 HTTP 错误?
- java - 你能“动态绑定”重载方法吗?
- svn - 我不希望其他用户提交文件或删除我在 SVN 中创建的文件。但用户应该能够读取该特定文件
- java - 如何使用 Selenium for Java 自动设置“https://stage.masterpassteststore.com/configuration”?
- ssrs-2012 - 在报表为套用信函的报表中添加分页符
- sql - 如果存在,我想按其分支数据的顺序获取数据
- sql-server - 使用 EntityFrameworkCore 更新记录
- asp.net - IIS 10 服务堆栈 .Net4.8 404