根据连接表中的值对日期列表进行分组

时间:2021-03-16 11:34:29

标签: sql postgresql

DB-Fiddle

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    event_date DATE,
    country VARCHAR,
    channel VARCHAR,
    sales DECIMAL
);

INSERT INTO sales
(event_date, country, channel, sales)
VALUES 
('2020-01-04', 'DE', 'channel_01', '500'),
('2020-01-04', 'FR', 'channel_01', '900'),
('2020-01-04', 'NL', 'channel_01', '100'),

('2020-02-20', 'DE', 'channel_01', '0'),
('2020-02-20', 'FR', 'channel_01', '0'),
('2020-02-20', 'NL', 'channel_01', '0'),

('2020-03-15', 'DE', 'channel_01', '700'),
('2020-03-15', 'FR', 'channel_01', '500'),
('2020-03-15', 'NL', 'channel_03', '300');


/* Table Dates */
CREATE TABLE dates (
    id SERIAL PRIMARY KEY,
    date DATE
);

INSERT INTO dates
(date) 
SELECT generate_series ('2020-01-01'::date, '2020-12-31'::date, interval '1 day');

预期结果:

date_list     |    country 
--------------|--------------------------
2020-01-01    |      DE
2020-01-01    |      FR
2020-01-01    |      NL
--------------|---------------------------
2020-01-02    |      DE
2020-01-02    |      FR
2020-01-02    |      NL
--------------|---------------------------
:             |      :
:             |      :
:             |      :
--------------|--------------------------
2020-12-29    |      DE
2020-12-30    |      NL 
2020-12-31    |      FR

我想列出表 dates 中的所有日期,并按表 sales 中可用的所有国家/地区对它们进行分组,无论日期是否存在于两个表中。到目前为止,我已经开发了这个查询:

SELECT 
d.date AS date_list,
t2.country
FROM dates d
LEFT JOIN

    (SELECT
    s.event_date,
    s.country,
    s.sales
    FROM sales s
    GROUP BY 1,2,3
    ORDER BY 1,2) t2 ON t2.event_date = d.date

GROUP BY 1,2
ORDER BY 1,2;

但是,如果 s.event_dated.date 匹配,它只会按国家/地区对结果进行分组。
我必须如何修改查询才能获得预期结果?

1 个答案:

答案 0 :(得分:0)

我不确定,如果我理解您的要求是否正确,但似乎是关于 CROSS JOIN

SELECT D.DATE,X.COUNTRY
FROM DATES AS D
CROSS JOIN
(
    SELECT DISTINCT COUNTRY FROM SALES
)X
相关问题