获得每蛾产品的总销售额,差距为0

时间:2015-07-08 10:09:43

标签: mysql sql

我最近遇到了一个SQL查询问题。我试图获得的是将每件产品都放在商店里,并展示每月销售的产品数量。但是,有时几个月没有销售这些产品,这意味着它们不会被展示。

例如,这是我现在得到的结果

      Article   Month  Sold
      CN140027    6     312
      CN140027    7     293
      CN140027    12    122
      CN140186    1     10
      CN140186    4     2

虽然我想得到更像这样的东西

      Article   Month  Sold
      CN140027    6     312
      CN140027    7     293
      CN140027    8     0
      CN140027    9     0
      CN140027    10    0
      CN140027    11    0
      CN140027    12    122
      CN140186    1     10
      CN140186    2     0
      CN140186    3     0
      CN140186    4     2

以下是我目前使用的查询

SELECT k.artikelnr, Months.datefield as `Months`, IFNULL(SUM(k.menge),0) as `Quantity`
FROM store_shop_korb as k LEFT OUTER JOIN office_calendar AS Months 
ON Months.datefield = month(k.date_insert)
WHERE k.date_insert BETWEEN "2014-12-01" AND "2015-12-31"
group by k.artikelnr, Months.datefield

我错过了什么?或者我做错了什么?任何帮助都非常感谢。

提前致谢。

编辑: 其他信息:

office_calendar是日历表。它只包含作为注册表的月份,从1到12。

此外,我还从名为' store_shop_korb'的表中获取文章/产品ID,该表包含订单的所有行(因此它包含文章ID,其价格,每个订单的数量..)

4 个答案:

答案 0 :(得分:1)

这对我有用:

SELECT k.artikelnr, c.datefield AS `Month`, COALESCE(s.Quantity, 0) AS Sold
FROM (
    SELECT artikelnr
    FROM store_shop_korb
    GROUP BY artikelnr
) k
JOIN office_calendar c
LEFT JOIN (
    SELECT artikelnr, MONTH(date_insert) AS monthfield, SUM(menge) AS Quantity
    FROM store_shop_korb
    GROUP BY artikelnr, MONTH(date_insert)
) s ON k.artikelnr = s.artikelnr AND c.datefield = s.monthfield
ORDER BY k.artikelnr, c.datefield

如果你有一个文章表,你可以在子查询k的位置使用它。我基本上正常化了。

说明:

基本上有3组数据可以加入。第一个是一组不同的文章(k),第二个是一组不同的月份(c)。这两个是无限制地连接在一起的,意味着你得到了笛卡尔积(每个文章x每个月)。然后将此结果与每个月的销售额挂钩,这样我们就不会丢失0个条目。

答案 1 :(得分:0)

添加其他where条件,我认为它将解决您的问题

SELECT k.artikelnr, Months.datefield as `Months`, IFNULL(SUM(k.menge),0) as `Quantity`

FROM store_shop_korb as k LEFT OUTER JOIN office_calendar AS Months ON Months.datefield = month(k.date_insert) IFNULL(SUM(k.menge),0)> 0和k.date_insert BETWEEN“2014-12-01”和“2015-12-31” 由k.artikelnr,Months.datefield

组成

答案 2 :(得分:0)

我在MSAccess中尝试了这个,它似乎工作正常

SELECT PRODUCT, CALENDAR.MONTH, A

FROM CALENDAR LEFT JOIN (

    SELECT PRODUCT, MONTH(SALEDTE) AS M, SUM(SALEAMOUNT) AS A
    FROM SALES 
    WHERE SALEDTE BETWEEN #1/1/2015# AND #12/31/2015#
    GROUP BY PRODUCT, MONTH(SALEDTE) ) AS X

ON X.M = CALENDAR.MONTH

enter image description here

答案 3 :(得分:-1)

如果您已有日历表,请使用此页。

SELECT B.Article,
       A.Month,
       COALESCE(c.Sold, 0)
FROM   (SELECT DISTINCT Months.datefield --Considering this as months feild
        FROM   office_calendar AS Months) A
       CROSS JOIN (SELECT DISTINCT article
                   FROM   Yourtable) B
       LEFT OUTER JOIN Yourtable C
                    ON a.month = c.Month
                       AND b.Article = c.Article 

否则你需要一个months表。试试这个。

SELECT *
FROM   (SELECT 1 AS month UNION
        SELECT 2 UNION
        SELECT 3 UNION
        SELECT 4 UNION
        SELECT 5 UNION
        SELECT 6 UNION
        SELECT 7 UNION
        SELECT 8 UNION
        SELECT 9 UNION
        SELECT 10 UNION
        SELECT 11 UNION
        SELECT 12) A
       CROSS JOIN (SELECT DISTINCT article
                   FROM   Yourtable) B
       LEFT OUTER JOIN Yourtable C
                    ON a.month = c.Month
                       AND b.Article = c.Article