我有两个不同的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。
答案 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'
正确加入它们并在“子查询”之外设置分组可能会更有效率(就像其他答案一样!)