0

我需要真正的专业 DBA 帮助!我找不到在日期表上针对销售数据表使用 LEFT JOIN、UNION、UNION ALL 或 IFNULL(salesblah, 0) 的合理解决方案。由于销售代表可能存在差距,因此单独运行对销售数据的查询已经结束。当然,我可以在 PHP 中创建一个数组来按日期对数据求和,但必须有一个我看不到的优雅解决方案,这个个人挑战让我筋疲力尽。必须有一个简短而甜蜜的解决方案。

在服务器上使用 MySQL 5.5.15 时,销售数据的摘录(当前为 800,000 行并且每天都在增长)如下所示:

    Rep         Date         QtyOrdered     PriceEach
    --------------------------------------------------
    1         2011-06-05              4        1457.23
    1         2011-08-01              1        3342.54
    1         2011-08-11             12         112.23
    2         2011-05-02              3        2654.23
    2         2011-08-23             22         423.43
    .            ...                ...            ...

另一个表只是从 2000-01-01 到 2034-12-31 的一列日期

使用(或不使用)日期表,当我在查询中调用 rep 1 时,我怎样才能得到这个结果:

YYYY-MM      Total Sales
------------------------
2010-08               0
2010-09               0
2010-10               0
2010-11               0
2010-12               0
2011-01               0
2011-02               0
2011-03               0
2011-04               0
2011-05               0
2011-06         5828.92
2011-07               0
2011-08         4960.14

我真希望能把这本未删节的粗话书收起来。谢谢你的才华。

编辑: Derek 的左连接解决方​​案省略了非零月份。Nerf 的子查询方法总和为一个月。我相信是 GROUP BY 正在扼杀非零月份。

谢谢!我相信最简单的课程是让 PHP 通过数组运行结果。最终,这是通过 GD 构建一个几个月范围内的图表,混合解决方案可能会在该部分中节省一步。

再次感谢你!

4

3 回答 3

1

这应该让你非常接近。未经测试,但逻辑应该是正确的。

select 
   cast(year(dt.date) as varchar(4)) + '-' + cast(month(dt.date) as varchar(2)),
   sum(QtyOrdered * PriceEach)
from salesdata sd
right join datetbl dt
  on sd.date = dt.date
where sd.rep = 1 and dt.date between '8/1/2010' and '8/31/2011'
group by cast(year(dt.date) as varchar(4)) + '-' + cast(month(dt.date) as varchar(2))
于 2011-08-31T01:32:04.680 回答
1
SELECT CONCAT_WS("-",  YEAR(date), DATE_FORMAT(date, '%m') ) AS "YYYY-MM", SUM(Total_Sales) AS "Total Sales"
FROM(
     SELECT dt.date, SUM(QtyOrdered * PriceEach) AS Total_Sales
    FROM sales_data sd
         LEFT JOIN datetbl dt
         ON sd.Date = dt.date
    WHERE sd.rep = 1 AND dt.date BETWEEN '2011-08-01' AND '2011-08-31'
        GROUP BY dt.date
         )  AS derived_table
于 2011-08-31T03:38:30.547 回答
1

我遇到了同样的问题,并且没有使用 JOIN 或任何复杂的东西就得到了解决方案。要避免的是按总数分组。这将显示按年、月和日排序的所有销售额,包括根本没有销售额的天数(dayTotal 将等于 0)

SELECT Year(transactions.paymentdate) AS orderYear,Month(transactions.paymentdate) AS orderMonth, Day(transactions.paymentdate) AS orderDay,
    SUM(transactions.amount) AS dayTotal
    FROM transactions
    group by orderYear desc,orderMonth desc, orderDay desc
于 2015-07-19T03:17:00.653 回答