[英]Combining result of independent select queries into one table
我正在学习如何在MySQL
编写查询,我有一个表来保存交易,并希望获取1. revenues sold through the full life span
总1. revenues sold through the full life span
, 2. Revenues in a day
3. Revenues in a week
, 3. Revenues in a week
4. Revenues in a month
和4. Revenues in a month
。 所有这些返回的表都具有相同的列 。
因此,我有两个表,一个包含所有交易的交易表和一个包含所有商品价格的价格表,当购买商品时,我从价格表中获取商品编号,以便我获取所需的交易价格结合两者,这是我的表结构:
价格表
|priceid | itemName | price |
-----------------------------
|1 |Bread | 20 |
交易表
|transactionid |pricefk | transactiondate |
--------------------------------------------
|112 |1 |2018-03-22 19:15:05|
我知道如何使用3个查询来获取一天,一周和一个月中的总收入,收入,但想要一种在一个查询中获取所有3个值的方法
我知道的是
SELECT SUM(p.price) as totalrevenue FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk
获得所有终身收入
SELECT SUM(p.price) as totalrevenue FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk where t.transactiondate >= NOW() - INTERVAL 1 DAY
一天获得收益
SELECT SUM(p.price) as totalrevenue FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk where YEARWEEK(t.transactiondate)=YEARWEEK(NOW())
在一周内获得收入
SELECT SUM(p.price) as totalrevenue FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk WHERE MONTH(t.transactiondate) = MONTH(CURRENT_DATE())
AND YEAR(t.transactiondate) = YEAR(CURRENT_DATE())
在一个月内获得收入
如何将所有这些查询合并到一个查询中?
您可以将它们包装在一个选择中,如下所示:
SELECT
(SELECT SUM(p.price) FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk)
as lifetimeRevenue,
(SELECT SUM(p.price) FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk where t.transactiondate >= NOW() - INTERVAL 1 DAY)
as dayRevenue,
(SELECT SUM(p.price) FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk where YEARWEEK(t.transactiondate)=YEARWEEK(NOW()))
as weekRevenue,
(SELECT SUM(p.price) FROM transaction_table t JOIN price_tb p ON p.priceid = t.pricefk WHERE MONTH(t.transactiondate) = MONTH(CURRENT_DATE()) AND YEAR(t.transactiondate) = YEAR(CURRENT_DATE()))
as monthRevenue
在这里工作提琴: http ://www.sqlfiddle.com/#!9/70ef6 /5
您没有使用任何外键,它们将有助于保持数据完整性,并通过使用外键使查询变得简单得多。
您可以在transaction_table
create table语句中添加类似的内容。
foreign key (pricefk) references price_tb(priceid)
在此之后,表上的所有join语句将只包含表名:
SELECT
(SELECT SUM(price) FROM transaction_table,price_tb)
as lifetimeRevenue,
(SELECT SUM(price) FROM transaction_table,price_tb where transactiondate >= NOW() - INTERVAL 1 DAY)
as dayRevenue,
(SELECT SUM(price) FROM transaction_table,price_tb where YEARWEEK(transactiondate)=YEARWEEK(NOW()))
as weekRevenue,
(SELECT SUM(price) FROM transaction_table,price_tb WHERE MONTH(transactiondate) = MONTH(CURRENT_DATE()) AND YEAR(transactiondate) = YEAR(CURRENT_DATE()))
as monthRevenue
完整的工作提琴: http ://www.sqlfiddle.com/#!9/9f333 /6
(注:我已经改名为pricefk
列priceid
作为一个标准的做法。)
所有这些查询仅返回一行,因此如果您需要将结果放在一行上,则可以尝试使用交叉联接
select t1.totalrevenue_lifetime, t2.totalrevenue_day, t3.totalrevenue_week , t4.totalrevenue_month
from (
SELECT SUM(p.price) as totalrevenue_lifetime
FROM transaction_table t
JOIN price_tb p ON p.priceid = t.pricefk
) t1
CROSS JOIN (
SELECT SUM(p.price) as totalrevenue_day
FROM transaction_table t
JOIN price_tb p ON p.priceid = t.pricefk
where t.transactiondate >= NOW() - INTERVAL 1 DAY
) t2
CROSS JOIN (
SELECT SUM(p.price) as totalrevenue_week
FROM transaction_table t
JOIN price_tb p ON p.priceid = t.pricefk
where YEARWEEK(t.transactiondate)=YEARWEEK(NOW())
) t3
CROSS JOIN (
SELECT SUM(p.price) as totalrevenue_month
FROM transaction_table t
JOIN price_tb p ON p.priceid = t.pricefk
WHERE MONTH(t.transactiondate) = MONTH(CURRENT_DATE())
AND YEAR(t.transactiondate) = YEAR(CURRENT_DATE())
) t4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.