2011-08-31 81 views
0

我需要真正的专业DBA帮助!我无法在销售数据表中找到合适的解决方案,使用LEFT JOIN,UNION,UNION ALL或IFNULL(salesblah,0)在日期表上。由于销售代表可能存在空白,因此在销售数据独奏中运行查询已经结束。当然,我可以在PHP中创建一个数组以便按日期汇总数据,但是必须有一个优雅的解决方案,我无法看到,而这个个人挑战让我疲惫不堪。对此,必须有一个简短而甜蜜的解决方案。MySQL:显示月度销售额并包括月份,其中没有销售的地方

随着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日

使用(或不使用)日期表,当我把一个代表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 

我我真的希望能够放弃一本毫无节制的不礼貌的书。感谢你的才能。

编辑:从德里克左加入解决方案省略非零月。 Nerf的子查询方法将所有内容汇总为一个月。我认为这是造成非零月份的GROUP BY。

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

再次感谢您!

+0

您到目前为止尝试了哪些查询?什么是表名? –

+0

这正是LEFT JOIN的设计目的。你能发表你试过的吗? –

回答

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)) 
+0

第二个示例集是* result *集。因此,您可能需要调整您的列。你很近。 –

+0

我的坏,现在编辑 –

+0

这是非常相似,我在哪里...当MySQLified语法: SELECT CONCAT(CAST(年(dt.dts)作为CHAR(4)),' - ',CAST(个月(dt.dts)AS CHAR(2))), SUM(qtyship *卖出) FROM SALESDATA SD LEFT JOIN datetbl DT ON sd.dts = dt.dts WHERE sd.rep = 2且dt.dts DATE_SUB(CURDATE(),INTERVAL 1年)和CURDATE() GROUP BY CONCAT(CAST(YEAR(dt.dts)AS CHAR(4)),' - ',CAST(MONTH(dt.dts)AS CHAR 2))) 只给出非零YYYY-MM – Thit

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 
+0

这一个与我一样并试图显示该范围内所有月份的总和。 – Thit

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 
相关问题