首页 文章

SQL在同一查询中汇总两个值

提问于
浏览
0

美好的一天,

我有一个包含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

1 回答

  • 0

    您可以使用条件聚合并将不同的条件移动到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

    第一种解决方案可能表现更好 .

相关问题