【问题标题】:SQL Sum two values within same querySQL对同一查询中的两个值求和
【发布时间】:2015-10-15 06:01:30
【问题描述】:

美好的一天,

我有一个包含 3 列的表。日期、商店、Straight_Sales。每天都会为每家商店的前一天的销售额创建一个新记录。

我要做的是生成一个结果集,其中包含每个位置当前当月至今的销售额以及过去一年相同的 MTD 销售额。

我可以通过使用两个完全独立的查询和结果集来实现这一点,但是我试图将它们包含在同一个查询中以用于报告目的。

这是我当前的两个运行良好的查询:

去年当月至今:

     SELECT SUM(summ_sales_daily.straight_sales), store_master.name 
     FROM
     store_master 
     INNER JOIN summ_sales_daily ON store_master.unit = summ_sales_daily.store 
      WHERE YEAR(date)=YEAR(DATE_SUB(NOW(), INTERVAL 1 YEAR)) AND MONTH(date)=MONTH(NOW())
     GROUP BY summ_sales_daily.store ORDER BY summ_sales_daily.store

当年当月至今:

     SELECT SUM(summ_sales_daily.straight_sales), store_master.name 
     FROM
     store_master 
     INNER JOIN summ_sales_daily ON store_master.unit = summ_sales_daily.store 
     WHERE YEAR(date)=YEAR(NOW()) AND MONTH(date)=MONTH(NOW()) 
     GROUP BY summ_sales_daily.store ORDER BY summ_sales_daily.store

我希望这些以相同的结果返回当前和前几年的 MTD 以及商店名称(因此加入)

任何帮助都会很棒!

使用 MariaDB

【问题讨论】:

  • 第一个查询中是否应该有WHERE 子句?
  • 尝试这样的事情,SUM( case When YEAR(date)=YEAR(DATE_SUB(NOW(), INTERVAL 1 YEAR)) Then summ_sales_daily.straight_sales else 0 End) MTD, SUM( case When YEAR (date)=YEAR(NOW()) 然后 summ_sales_daily.straight_sales else 0 End) YMTD
  • 是的,抱歉。当我复制和粘贴时,我必须手动格式化它以使其看起来正确。不知何故删除了那个。解决它!谢谢!
  • 我不知道 MariaDB 的语法,但是看看你是否可以使用我提到的 case 语句。删除年的 where 子句,只保留月
  • 联合可能会解决您的问题。

标签: mysql sql mariadb


【解决方案1】:

您可以使用条件聚合并将不同的条件移动到 sum 函数中的 case 表达式中:

SELECT 
    store_master.name
    , SUM(CASE WHEN YEAR(date)=YEAR(DATE_SUB(NOW(), INTERVAL 1 YEAR)) THEN summ_sales_daily.straight_sales ELSE 0 END) last_year_sales
    , SUM(CASE WHEN YEAR(date)=YEAR(NOW()) THEN summ_sales_daily.straight_sales ELSE 0 END) current_year_sales
FROM store_master 
INNER JOIN summ_sales_daily ON store_master.unit = summ_sales_daily.store 
WHERE MONTH(date)=MONTH(NOW())
GROUP BY summ_sales_daily.store 
ORDER BY summ_sales_daily.store;

或者您可以在您加入的几个派生表中计算两个不同的值:

SELECT 
  store_master.name, 
  last_year.sales as previous_mtd, 
  current_year.sales as current_mtd
FROM store_master 
LEFT JOIN (
    SELECT store, SUM(straight_sales) sales
    FROM summ_sales_daily
    WHERE YEAR(date)=YEAR(DATE_SUB(NOW(), INTERVAL 1 YEAR)) AND MONTH(date)=MONTH(NOW())
    GROUP BY store 
) last_year ON store_master.unit = last_year.store 
LEFT JOIN (
    SELECT store, SUM(summ_sales_daily.straight_sales) sales
    FROM summ_sales_daily 
    WHERE YEAR(date)=YEAR(NOW()) AND MONTH(date)=MONTH(NOW()) 
    GROUP BY store 
) current_year ON store_master.unit = current_year.store ;

Sample SQL Fiddle

第一个解决方案可能会执行得更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2013-01-30
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多