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