按日期分组多个表
Group by date for multiple tables
(我正在使用 postgres)
我有两个来自不同表的查询。每个都按日期分组。
将它们加入一个查询(UNION 或 JOIN)的最佳方法是什么?
提前致谢。
查询 №1:
SELECT to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM "table_1"
GROUP BY 1,2
ORDER BY 2,1;
查询 1 的结果:
mon | yyyy | user_sum | system_sum
-----+------+------------------+-----------------
11 | 2015 | 10 | 50
12 | 2015 | 20 | 60
(2 rows)
查询 №2:
SELECT to_char(created_at,'MM') as mon,
extract(year from created_at) as yyyy,
SUM("table_2"."amount") AS payments_sum
FROM "table_2"
GROUP BY 1,2
ORDER BY 2,1;
查询 №2 的结果:
mon | yyyy | payments_sum
-----+------+--------------
10 | 2015 | 500
11 | 2015 | 600
12 | 2015 | 700
01 | 2016 | 800
(4 rows)
要求的结果:
mon | yyyy | payments_sum | user_sum | system_sum
-----+------+--------------+------------------+----------------
10 | 2015 | 500 | |
11 | 2015 | 600 | 10 | 50
12 | 2015 | 700 | 20 | 60
01 | 2016 | 800 | |
(4 rows)
试试这个。
SELECT
to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_2"."amount") AS payments_sum,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM
"table_1"
LEFT JOIN
"table_2" ON (to_char("table_1"."date", 'MM') = to_char("table_2"."date", 'MM') AND extract(year from "table_1"."date") = extract(year from "table_2"."date"))
GROUP BY 1,2
ORDER BY 2,1;
我认为您可以将每个查询视为一个子查询,然后与完整的外部联接结合。 Union 可能不是你想要的。
像这样:
SELECT * FROM
(SELECT to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM "table_1"
GROUP BY 1,2) AS q1
FULL OUTER JOIN
(SELECT to_char(created_at,'MM') as mon,
extract(year from created_at) as yyyy,
SUM("table_2"."amount") AS payments_sum
FROM "table_2"
GROUP BY 1,2) AS q2
ON q1.mon = q2.mon AND q1.yyyy = q2.yyyy
ORDER BY 2,1
在 mon 和 yyyy 值匹配的地方加入。
这是另一个更 PostgreSQL 特定的语法:
WITH query_one AS (
SELECT
to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM
"table_1"
GROUP BY
1,2
), query_two AS (
SELECT
to_char(created_at,'MM') as mon,
extract(year from created_at) as yyyy,
SUM("table_2"."amount") AS payments_sum
FROM
"table_2"
GROUP BY
1,2
)
SELECT
*
FROM
query_one
LEFT JOIN query_two USING (mon, yyyy)
ORDER BY
yyyy
, mon;
USING
子句更容易使用,避免mon
和yyyy
在输出中出现两次,其余的只是为了看得清楚。
(我正在使用 postgres)
我有两个来自不同表的查询。每个都按日期分组。 将它们加入一个查询(UNION 或 JOIN)的最佳方法是什么? 提前致谢。
查询 №1:
SELECT to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM "table_1"
GROUP BY 1,2
ORDER BY 2,1;
查询 1 的结果:
mon | yyyy | user_sum | system_sum
-----+------+------------------+-----------------
11 | 2015 | 10 | 50
12 | 2015 | 20 | 60
(2 rows)
查询 №2:
SELECT to_char(created_at,'MM') as mon,
extract(year from created_at) as yyyy,
SUM("table_2"."amount") AS payments_sum
FROM "table_2"
GROUP BY 1,2
ORDER BY 2,1;
查询 №2 的结果:
mon | yyyy | payments_sum
-----+------+--------------
10 | 2015 | 500
11 | 2015 | 600
12 | 2015 | 700
01 | 2016 | 800
(4 rows)
要求的结果:
mon | yyyy | payments_sum | user_sum | system_sum
-----+------+--------------+------------------+----------------
10 | 2015 | 500 | |
11 | 2015 | 600 | 10 | 50
12 | 2015 | 700 | 20 | 60
01 | 2016 | 800 | |
(4 rows)
试试这个。
SELECT
to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_2"."amount") AS payments_sum,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM
"table_1"
LEFT JOIN
"table_2" ON (to_char("table_1"."date", 'MM') = to_char("table_2"."date", 'MM') AND extract(year from "table_1"."date") = extract(year from "table_2"."date"))
GROUP BY 1,2
ORDER BY 2,1;
我认为您可以将每个查询视为一个子查询,然后与完整的外部联接结合。 Union 可能不是你想要的。
像这样:
SELECT * FROM
(SELECT to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM "table_1"
GROUP BY 1,2) AS q1
FULL OUTER JOIN
(SELECT to_char(created_at,'MM') as mon,
extract(year from created_at) as yyyy,
SUM("table_2"."amount") AS payments_sum
FROM "table_2"
GROUP BY 1,2) AS q2
ON q1.mon = q2.mon AND q1.yyyy = q2.yyyy
ORDER BY 2,1
在 mon 和 yyyy 值匹配的地方加入。
这是另一个更 PostgreSQL 特定的语法:
WITH query_one AS (
SELECT
to_char(date,'MM') as mon,
extract(year from date) as yyyy,
SUM("table_1"."user_money") AS user_sum,
SUM("table_1"."system_money") AS system_sum
FROM
"table_1"
GROUP BY
1,2
), query_two AS (
SELECT
to_char(created_at,'MM') as mon,
extract(year from created_at) as yyyy,
SUM("table_2"."amount") AS payments_sum
FROM
"table_2"
GROUP BY
1,2
)
SELECT
*
FROM
query_one
LEFT JOIN query_two USING (mon, yyyy)
ORDER BY
yyyy
, mon;
USING
子句更容易使用,避免mon
和yyyy
在输出中出现两次,其余的只是为了看得清楚。