【问题标题】:Count of rows returned by 2 out of 3 SELECTs combined with UNION3 个 SELECT 中的 2 个与 UNION 结合返回的行数
【发布时间】:2011-08-11 20:45:38
【问题描述】:

我很难为这篇文章命名。

我们如何才能完成以下任务?

SELECT 'Body' AS LineType, ItemName, Quantity FROM TableX
UNION ALL
SELECT 'Body' AS LineType, ItemName, Quantity FROM TableY
UNION ALL
SELECT 'Trailer' AS LineType, null As ItemName, <count of the above two SELECTs> 

结果应该是这样的:

LineType     ItemName     Qty
Body         Nut          19
Body         Bolt         25
Trailer      NULL         2

请帮忙;感谢 SOF 社区。

【问题讨论】:

    标签: sql-server tsql select union-all


    【解决方案1】:

    尝试 CTE:

    ;WITH FirstQ AS 
    (
        SELECT 'Body' AS LineType, ItemName, Quantity FROM TableX
    ), SecondQ AS 
    (
        SELECT 'Body' AS LineType, ItemName, Quantity FROM TableY
    )
    SELECT * FROM FirstQ
    UNION ALL SELECT * FROM SecondQ
    UNION ALL
    SELECT 'Trailer' AS LineType, null As ItemName, ((SELECT COUNT(*) FROM FirstQ) +(SELECT COUNT(*) FROM SecondQ)) AS Quantity
    

    工作示例代码:

    declare @TableX table (ItemName varchar(5), Quantity int)
    INSERT @TableX VALUES ('aa',10)
    INSERT @TableX VALUES ('bb',20)
    
    declare @TableY table (ItemName varchar(5), Quantity int)
    INSERT @TableX VALUES ('cc',30)
    
    ;WITH FirstQ AS 
    (
        SELECT 'Body' AS LineType, ItemName, Quantity FROM @TableX
    ), SecondQ AS 
    (
        SELECT 'Body' AS LineType, ItemName, Quantity FROM @TableY
    )
    SELECT * FROM FirstQ
    UNION ALL SELECT * FROM SecondQ
    UNION ALL
    SELECT 'Trailer' AS LineType, null As ItemName, ((SELECT COUNT(*) FROM FirstQ) +(SELECT COUNT(*) FROM SecondQ)) AS Quantity
    

    输出:

    LineType ItemName Quantity
    -------- -------- -----------
    Body     aa       10
    Body     bb       20
    Body     cc       30
    Trailer  NULL     3
    
    (4 row(s) affected)
    

    【讨论】:

    • 这行得通。只要 SOF 允许,我就会将此标记为答案。感谢您的快速回复。
    【解决方案2】:
    declare @TableX table (ItemName varchar(10),Quantity int)
    declare @TableY table (ItemName varchar(10),Quantity int)
    
    insert @tableX VALUES('door',0)
    insert @tableX VALUES('window',10)
    insert @tableX VALUES('wheel',5)
    insert @tableX VALUES('brake',7)
    insert @tableX VALUES('handle',3)
    insert @tableX VALUES('lamp',207)
    
    insert @tableY VALUES('Ydoor',0)
    insert @tableY VALUES('Ywindow',10)
    insert @tableY VALUES('Ywheel',5)
    insert @tableY VALUES('Ybrake',7)
    insert @tableY VALUES('Yhandle',3)
    insert @tableY VALUES('Ylamp',207)
    
    SELECT 'Body' as LineType, ItemName, Sum(Quantity) qty, Count(*) [count] FROM
    (
    SELECT ItemName, Quantity FROM @TableX
    UNION
    SELECT ItemName, Quantity FROM @TableY
    ) u
    
    GROUP BY ItemName WITH ROLLUP
    

    【讨论】:

    • 几个错误:需要删除多余的UNION ALL,需要删除GROUP BY中的as LineType。之后,你仍然会得到:Each GROUP BY expression must contain at least one column that is not an outer reference.
    • @KM -- 感谢您的校对。懒得测试了。请参阅修改后的答案。
    • 漂亮在旁观者的眼中。您的版本不提供 LineType='Trailer' 的行,而是将该行生成为 LineType='Body'。我敢打赌,OP 需要“Trailer”值来进行某些处理,而拥有“Body”值将无法满足他们的需求。
    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多