UNION 多个结果集到单独的列
UNION multiple result sets into separate columns
我在多个结果集中返回了三个 SELECT 语句:
SELECT COUNT(*) AS OrdersInStep1 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 1) AS OrdersInStep1
SELECT COUNT(*) AS OrdersInStep2 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 2) AS OrdersInStep2
SELECT COUNT(*) AS OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND (d.db_Task = 3 OR d.db_Task = 4)
AND d.db_SeqNo != 34
AND d.db_SeqNo != 31) AS OrdersInStep3
我可以使用UNION
将这些结果集合并为一列,但是怎么可能将它们合并为一个结果集,而是三列呢?
示例:
OrdersInStep1 | OrdersInStep2 | OrdersInStep3
12 | 16 | 3
您可以构建一个具有所需订单的 CTE,这样您就不必将相同的查询 运行 保持 3 次..然后只需 select 您从 CTE 中获得的计数。 temp table 在这里也将是 acceptable 而不是 CTE,甚至可能表现得更好..
WITH cte AS (
SELECT
os.db_OrderNo,
d.db_SeqNo,
d.db_Task
FROM
tblOrders os
JOIN tblRefOrderType ot ON ot.db_OrderType = os.db_OrderType
JOIN tblDate d ON d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task IN (1, 2, 3, 4)
)
SELECT
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task = 1) OrdersInStep1,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task = 2) OrdersInStep2,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task IN (3, 4)
AND db_SeqNo NOT IN (31, 34)) OrdersInStep3
大功告成,您只需要在每个 select 语句中有匹配的列数。您可以根据需要传递空 ''
或 NULL
值。
SELECT COUNT(*) AS OrdersInStep1, NULL as OrdersInStep2, NULL as OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 1) AS OrdersInStep1
UNION
SELECT NULL as OrdersInStep1, COUNT(*) AS OrdersInStep2, NULL as OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 2) AS OrdersInStep2
UNION
SELECT NULL as OrdersInStep1, NULL as OrdersInStep2, COUNT(*) AS OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND (d.db_Task = 3 OR d.db_Task = 4)
AND d.db_SeqNo != 34
AND d.db_SeqNo != 31) AS OrdersInStep3
我在多个结果集中返回了三个 SELECT 语句:
SELECT COUNT(*) AS OrdersInStep1 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 1) AS OrdersInStep1
SELECT COUNT(*) AS OrdersInStep2 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 2) AS OrdersInStep2
SELECT COUNT(*) AS OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND (d.db_Task = 3 OR d.db_Task = 4)
AND d.db_SeqNo != 34
AND d.db_SeqNo != 31) AS OrdersInStep3
我可以使用UNION
将这些结果集合并为一列,但是怎么可能将它们合并为一个结果集,而是三列呢?
示例:
OrdersInStep1 | OrdersInStep2 | OrdersInStep3
12 | 16 | 3
您可以构建一个具有所需订单的 CTE,这样您就不必将相同的查询 运行 保持 3 次..然后只需 select 您从 CTE 中获得的计数。 temp table 在这里也将是 acceptable 而不是 CTE,甚至可能表现得更好..
WITH cte AS (
SELECT
os.db_OrderNo,
d.db_SeqNo,
d.db_Task
FROM
tblOrders os
JOIN tblRefOrderType ot ON ot.db_OrderType = os.db_OrderType
JOIN tblDate d ON d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task IN (1, 2, 3, 4)
)
SELECT
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task = 1) OrdersInStep1,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task = 2) OrdersInStep2,
(SELECT COUNT(DISTINCT db_OrderNo)
FROM cte
WHERE db_Task IN (3, 4)
AND db_SeqNo NOT IN (31, 34)) OrdersInStep3
大功告成,您只需要在每个 select 语句中有匹配的列数。您可以根据需要传递空 ''
或 NULL
值。
SELECT COUNT(*) AS OrdersInStep1, NULL as OrdersInStep2, NULL as OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 1) AS OrdersInStep1
UNION
SELECT NULL as OrdersInStep1, COUNT(*) AS OrdersInStep2, NULL as OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND d.db_Task = 2) AS OrdersInStep2
UNION
SELECT NULL as OrdersInStep1, NULL as OrdersInStep2, COUNT(*) AS OrdersInStep3 FROM
(SELECT DISTINCT
os.db_OrderNo
FROM tblOrders os
JOIN tblRefOrderType ot on ot.db_OrderType = os.db_OrderType
LEFT JOIN tblDate d on d.db_SeqNo = os.db_Status
WHERE
os.db_Deleted = 0
AND db_Date39 = '1900/01/01'
AND (d.db_Task = 3 OR d.db_Task = 4)
AND d.db_SeqNo != 34
AND d.db_SeqNo != 31) AS OrdersInStep3