我有两个表:
表“ DATES”包含天数:
select * from dates;
click_date
------------
2019-08-14
2019-08-04
2019-07-24
表格“点击次数”包含日期,点击次数,点击次数:
select date,clicker,click_count
from Clicks;
date | clicker | click_count
-----------------------------------
2019-08-04 | 3422 | 2
2019-07-24 | 3539 | 7
我需要获取所有日期的所有clicker和click_count:
date | clicker | click_count
------------------------------------
2019-08-04 | 3422 | 2
2019-08-14 | 3422 | 0
2019-07-24 | 3422 | 0
2019-08-04 | 3539 | 0
2019-08-14 | 3539 | 0
2019-07-24 | 3539 | 7
请咨询。
科比
答案 0 :(得分:6)
我实际上将在此处使用交叉联接,然后再使用另一个左联接引入点击计数数据:
SELECT
d.click_date,
c1.clicker,
COALESCE(c2.click_count, 0) AS click_count
FROM dates d
CROSS JOIN Clicks c1
LEFT JOIN Clicks c2
ON d.click_date = c2.date AND c1.clicker = c2.clicker
ORDER BY
c1.clicker,
d.click_date;
注意:如果Clicks
表中的给定答题器可能出现多次,请使用:
CROSS JOIN (SELECT DISTINCT clicker FROM Clicks) c1
在交叉连接之前删除重复项。
答案 1 :(得分:0)
您可以尝试执行此操作,cte
部分仅用于获取不同的日期,如果您已经具有不同的日期,则可以跳过此日期。
; with cte as (
select distinct click_date from dates
)
select c.click_date, cl.clicker, case when c.click_date=cl.date then cl.click_count else 0 end as Counts
from cte as c cross join Clicks as cl
order by cl.clicker, c.click_date
您只需要简单的cross join
就可以得到想要的结果,因为我知道您的问题只与结果中的count
列有关。为此,case
条件足以获得所需的结果。
答案 2 :(得分:0)
左联接可以满足以下需求
select d.date, c.clicker, Case
when c.click_count IS NULL Then 0
ELSE c.click_count End
from dates d left join clicks c on
d.date=c.date;
答案 3 :(得分:0)
您希望每个日期和答题器一个结果行,因此将两者交叉连接。如果没有Clickers表,则可以从clicks表中获取Clickers。最后外部加入clicks表:
select
dates.click_date,
clickers.clicker,
coalesce(clicks.click_count, 0) as clicks_count
from dates
cross join (select distinct clicker from clicks) clickers
left join clicks on clicks.date = dates.date and clicks.clicker = clickers.clicker
order by dates.click_date, clickers.clicker;
答案 4 :(得分:-1)
select date,clicker,click_count
from Clicks where date IN (select click_date from dates);