繁体   English   中英

将独立选择查询的结果合并到一个表中

[英]Combining result of independent select queries into one table

我正在学习如何在MySQL编写查询,我有一个表来保存交易,并希望获取1. revenues sold through the full life span1. revenues sold through the full life span2. Revenues in a day 3. Revenues in a week3. Revenues in a week 4. Revenues in a month4. 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

(注:我已经改名为pricefkpriceid作为一个标准的做法。)

所有这些查询仅返回一行,因此如果您需要将结果放在一行上,则可以尝试使用交叉联接

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM