[英]Joining Table A and B to get elements of both
我有兩個表:
表“預訂”:
id | date | hours
--------------------------
1 | 06/01/2016 | 2
1 | 06/02/2016 | 1
2 | 06/03/2016 | 2
3 | 06/03/2016 | 4
表'lookupCalendar':
date
-----
06/01/2016
06/02/2016
06/03/2016
我想將他們合並在一起,以便為每個預訂指定一個日期,以便結果如下所示:
表“結果”:
id | date | hours
--------------------------
1 | 06/01/2016 | 2
1 | 06/02/2016 | 1
1 | 06/03/2016 | 0 <-- Added by query
2 | 06/01/2016 | 0 <-- Added by query
2 | 06/02/2016 | 0 <-- Added by query
2 | 06/03/2016 | 2
3 | 06/01/2016 | 0 <-- Added by query
3 | 06/02/2016 | 0 <-- Added by query
3 | 06/03/2016 | 4
我已經嘗試進行交叉申請,但是這並不能使我到達那里,也沒有完全加入。 FULL JOIN
只是在id列中給了我空值,而交叉應用給了我太多數據。
有沒有可以給我上面results
表的查詢?
更多信息
請注意,我這樣做是為了使我可以計算一段時間內的平均預訂小時數,而不僅僅是表中的記錄數。
理想情況下,我可以
SELECT AVG(hours) AS my_average, id
FROM bookings
GROUP BY id
但是,由於那只會給我一個記錄數,而不是我想將其與日期交叉應用的天數。 然后我認為我可以對results
表進行上述查詢。
select i.id, c.date, coalesce(b.hours, 0) as hours
from lookupCalendar c
cross join (select distinct id from bookings) i
left join bookings b
on b.id = i.id
and b.date = c.date
order by i.id, c.date
嘗試這個:
select c.date, b.id, isnull(b.hours, 0)
from lookupCalendar c
left join bookings b on b.date = c.date
LookupCalendar
是您的主表,因為您希望針對每個日期進行預訂,而不管該日期是否有預訂,因此需要left join
LookupCalendar
。
我不確定您是否需要包含b.id
來解決您的實際問題。 您是否只想獲取像這樣的每個日期的總預訂小時數,然后計算平均值?:
select c.date, sum(isnull(b.hours, 0))
from lookupCalendar c
left join bookings b on b.date = c.date
group by c.date
您可以嘗試加入ID和日期的所有組合,然后保留加入數據的權限;
WITH Booking AS (SELECT *
FROM (VALUES
( 1 , '06/01/2016', 2 )
, ( 1 , '06/02/2016', 1 )
, ( 2 , '06/03/2016', 2 )
, ( 3 , '06/03/2016', 4 )
) x (id, date, hours)
)
, lookupid AS (
SELECT DISTINCT id FROM Booking
)
, lookupCalender AS (
SELECT DISTINCT date FROM Booking
)
SELECT ID.id, Cal.Date, ISNULL(B.Hours,0) AS hours
FROM lookupid id
INNER JOIN lookupCalender Cal
ON 1 = 1
LEFT JOIN Booking B
ON id.id = B.id
AND Cal.date = B.Date
ORDER BY ID.id, Cal.Date
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.