簡體   English   中英

連接表A和B以獲取兩者的元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM