按部分划分的销售和交易总数,按过去24个月分组

时间:2015-11-18 21:10:25

标签: mysql

SELECT det.partNum,
SUM(det.quantity) AS Demand1,
COUNT(det.partNum) AS Call1

FROM details det

JOIN invoice inv ON det.invoice_id = inv.id
WHERE inv.invoice_date
BETWEEN '2015-11-01 00:00:00'
AND '2015-11-31 23:59:59'

GROUP BY partNum

上述sql返回所有部件号,销售总数(需求)以及当前月份(部分)参与的事件总数(呼叫)。

我们的供应商想要的是每个部分的这些信息,但也为过去24个月的每一部分分组。他们要求的csv看起来如下(如果仅查看过去3个月):

Part# | Demand1 | Demand2 | Demand3 | Call1 | Call2 | Call3
123   |       0 |       2 |       0 |     0 |     1 |     0
345   |       6 |       3 |       4 |     1 |     2 |     3

Part# 123: 0 transactions this month (Call1) 0 quantity sold (Demand1)
       1 transaction last month (Call2) 2 quantity sold (Demand2).
       0 transactions two months ago (Call3) 0 quantity sold (Demand3).

Part# 345: 1 transaction this month (Call1) for qty sold of 6 (Demand1)
       2 transactions last month (Call2) for qty sold of 3 (Demand2)
       3 transactions two months ago (Call3) for qty sold of 4 (Demand3)

意识到他们希望在过去24个月内延长这一期限。 Demand1 / Call1始终是当月。

我使用WHERE / BETWEEN语句来显示日期的来源,并演示如何准确报告当月的零件。

我无法弄清楚怎么做才能填补需求和通话24个月。这是供应商期望数据的格式。这不是我的选择。任何有助于使这项工作按预期工作的帮助将不胜感激。

由于

修改

我删除了sql-server标记。对于那个很抱歉。这只是MySQL。

另外,我正在添加下面的回复......

查看DATEDIFF,TIMESTAMPDIFF甚至PERIOD_DIFF。但实际上似乎都没有回报我需要的东西。需要发生的是第一个需求列应该搜索当前月份,第1天(包括)到下个月,第1天(不包括)。下一个需求列应搜索当前月份 - 一个月,第1天(包括)到下个月 - 一个月,第1天(不包括)。并且每个后续列应搜索相同的参数,每列减去额外的月份。我认为只需使用DATEDIFF就可以精确地完成。

我希望这是有道理的。

再次感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你可以这样做:

SELECT 
  det.partNum,
  SUM(case when inv.invoice_date >= dateadd(month, -3, @currMonth) and inv.invoice_date < dateadd(month, -2, @currMonth) then det.quantity else 0) AS Demand1,
  SUM(case when inv.invoice_date >= dateadd(month, -2, @currMonth) and inv.invoice_date < dateadd(month, -1, @currMonth) then det.quantity else 0) AS Demand2,
...
FROM details det

JOIN invoice inv ON det.invoice_id = inv.id
WHERE 
  inv.invoice_date >= '2015-11-01 00:00:00' AND inv.invoice_date < '2015-12-01'

GROUP BY partNum

这使用具有当前月份开始日期的变量来使SQL更简单。我也改变了where子句,你应该使用&gt; = +&lt;与日期而不是之间。

答案 1 :(得分:0)

这可能会让您开始使用Pivot查询。

;WITH cte AS 
(
    SELECT  det.partNum,
            SUM(det.quantity) AS DemandSum,
            COUNT(det.partNum) AS CallCount,
            DATEDIFF(MONTH,inv.invoice_date, GETDATE()) + 1 MonthDiff
    FROM    details det
            JOIN invoice inv ON det.invoice_id = inv.id
    GROUP BY det.partNum, DATEDIFF(MONTH,inv.invoice_date, GETDATE()) + 1

)
SELECT t.partNum,
       [Demand1],[Demand2],[Demand3],[Demand4],[Demand5],[Demand6],[Demand7],[Demand8],[Demand9],[Demand10],[Demand11],[Demand12],
       [Demand13],[Demand14],[Demand15],[Demand16],[Demand17],[Demand18],[Demand19],[Demand20],[Demand21],[Demand22],[Demand23],[Demand24],
       [Call1],[Call2],[Call3],[Call4],[Call5],[Call6],[Call7],[Call8],[Call9],[Call10],[Call11],[Call12],
       [Call13],[Call14],[Call15],[Call16],[Call17],[Call18],[Call19],[Call20],[Call21],[Call22],[Call23],[Call24]
FROM (SELECT DISTINCT partNum FROM cte) t
LEFT JOIN (
        SELECT * FROM (
            SELECT partNum, DemandSum, CONCAT('Demand',MonthDiff) ColName FROM cte
        ) c PIVOT (SUM(DemandSum) FOR ColName IN ([Demand1],[Demand2],[Demand3],[Demand4],[Demand5],[Demand6],[Demand7],[Demand8],[Demand9],[Demand10],[Demand11],[Demand12],
                                                [Demand13],[Demand14],[Demand15],[Demand16],[Demand17],[Demand18],[Demand19],[Demand20],[Demand21],[Demand22],[Demand23],[Demand24])    
        ) p
    ) ds ON ds.partNum = t.partNum
LEFT JOIN (
        SELECT * FROM (
            SELECT partNum, CallCount, CONCAT('Call',MonthDiff) ColName FROM cte
        ) c PIVOT (COUNT(CallCount) FOR ColName IN ([Call1],[Call2],[Call3],[Call4],[Call5],[Call6],[Call7],[Call8],[Call9],[Call10],[Call11],[Call12],
                                                [Call13],[Call14],[Call15],[Call16],[Call17],[Call18],[Call19],[Call20],[Call21],[Call22],[Call23],[Call24])    
        ) p
    ) cc ON cc.partNum = t.partNum

如果这太令人困惑,您可以使用CASE方法。我做的有点不同于另一个答案..

SELECT 
    det.partNum,
    SUM(case WHEN DATEDIFF(MONTH, inv.invoice_date, GETDATE()) = 0 then det.quantity else 0 end) AS Demand1,
    SUM(case WHEN DATEDIFF(MONTH, inv.invoice_date, GETDATE()) = 1 then det.quantity else 0 end) AS Demand2,
    SUM(case WHEN DATEDIFF(MONTH, inv.invoice_date, GETDATE()) = 2 then det.quantity else 0 end) AS Demand3,
    COUNT(case WHEN DATEDIFF(MONTH, inv.invoice_date, GETDATE()) = 0 then det.partNum end) AS Call1,
    COUNT(case WHEN DATEDIFF(MONTH, inv.invoice_date, GETDATE()) = 1 then det.partNum end) AS Call2,
    COUNT(case WHEN DATEDIFF(MONTH, inv.invoice_date, GETDATE()) = 2 then det.partNum end) AS Call3
FROM 
    details det
    JOIN invoice inv ON det.invoice_id = inv.id
GROUP BY 
    det.partNum

您可以在此处获取所有24个月的完整脚本.. SQL Fiddle