如何将两个SELECT查询作为单个表,其中一个表具有聚合列

时间:2017-10-04 08:42:32

标签: sql sql-server

我有两个不同的SQL查询,它们会生成以下结果。

SELECT dbo.HomeUnit.unit_id
     , dbo.HomeUnit.type_id
     , dbo.UnitType.[type]
     , HomeUnit.unitqty
FROM dbo.HomeUnit
    INNER JOIN dbo.UnitType ON dbo.HomeUnit.type_id = dbo.UnitType.type_id
WHERE home_id='H2L54'

这会产生如下结果

unit_id | type_id | type         | unitqty
UG4LG   |  UTUEP  | Driver's Bed |    6
UQTK6   |  UTFX5  | Normal Unit  |   14
UQTJ6   |  UTFG5  | Normal Unit  |   12

这是第二个查询:

SELECT unit_id
     , home_id
     , SUM(numberofunits) as totalunitsbooked
FROM View_Reservation_With_Unit
WHERE home_id = 'H2L54'
    AND reservation_status='1'
    AND (NOT (fromdate > '2017-09-25' OR todate < '2017-09-26'))
GROUP BY home_id, unit_id

以上查询的输出让我这个

unit_id | home_id | totalunitsbooked
U3CFF   |  H2L54  |  5
UFRXJ   |  H2L54  |  1

我的问题是:如何将专栏和#34; totalunitsbooked&#34;在第一个结果集中作为列,如果没有预订任何单位,则指定0。

2 个答案:

答案 0 :(得分:0)

这应该有效:

SELECT h.unit_id
     , h.type_id
     , u.[type]
     , h.unitqty
     , SUM(ISNULL(v.reservation_status,0)) as totalunitsbooked
FROM dbo.HomeUnit h
    INNER JOIN dbo.UnitType u ON h.type_id = u.type_id
    LEFT JOIN View_Reservation_With_Unit v ON v.unit_id = h.unit_id
        AND v.reservation_status = '1' AND (NOT (fromdate > '2017-09-25' OR todate < '2017-09-26'))
WHERE home_id='H2L54'
GROUP BY h.unit_id, h.type_id, u.[type], h.unitqty

我所做的是将您的第二个查询包含为LEFT JOIN(否则所有不在视图中的单位都不会显示),然后使用ISNULL功能简化显示0表示未预订的所有单位。

别名只是为了便于阅读。

答案 1 :(得分:0)

我没有对此进行过测试,但这样做的快速简便方法是加入第二个查询:

SELECT dbo.HomeUnit.unit_id
     , dbo.HomeUnit.type_id
     , dbo.UnitType.[type]
     , HomeUnit.unitqty
FROM dbo.HomeUnit
    INNER JOIN dbo.UnitType ON dbo.HomeUnit.type_id = dbo.UnitType.type_id
    LEFT JOIN (
        SELECT unit_id
             , home_id
             , SUM(numberofunits) as totalunitsbooked
        FROM View_Reservation_With_Unit
        WHERE home_id = 'H2L54'
            AND reservation_status='1'
            AND (NOT (fromdate > '2017-09-25' OR todate < '2017-09-26')
    )
    ON dbo.HomeUnit.unit_id = unit_id
GROUP BY home_id, unit_id)
WHERE home_id='H2L54'

正确加入它们并在“子查询”之外设置分组可能会更有效率(就像其他答案一样!)