sql- 将每个月显示为项目总和(数量)的字段名称

sql- Show each month as field name for sum(qty) of items

我想相应地显示每个月的总数量

ItemCode | October | November  |  December |  January
 PZ         0         0            12          36

到目前为止我的查询看起来像

我的SQL是

SELECT Detail.ItemCode
    ,SUM(Detail.QuantityOrdered) AS Total_Quantity
    ,MonthName(Month([Header.OrderDate])) AS ['Month Name']
FROM Detail
INNER JOIN Header ON Detail.SalesOrderNo = Header.SalesOrderNo
WHERE Header.OrderDate >= dateadd("m", - 4, DATE ())
GROUP BY Detail.ItemCode
    ,Header.OrderDate
ORDER BY SUM(Detail.QuantityOrdered) DESC;

我的 Header.OrderDate 看起来像 12/25/2016。

我应该使用 crossover 吗?我查阅了很多资料,但 none 似乎适用。非常感谢您!!

在我看来,您正在寻找的是 unpivot,但它在 MS-Acess 中不存在。

最简单的复制方法如下:

SELECT ItemCode, October as Total_Quantity, 'October' as MonthName
UNION                     
SELECT ItemCode, November as Total_Quantity, 'November' as MonthName
UNION                     
SELECT ItemCode, December as Total_Quantity, 'December'as MonthName
UNION                    
SELECT ItemCode, January as Total_Quantity, 'January' as MonthName

正如@Jayvee 提到的,Transform 看起来很有希望。

或者,您可以进行条件聚合,自从我使用 Access 以来已经有一段时间了,但是像这样:

    SELECT Detail.ItemCode
        , SUM(CASE WHEN Month([Header.OrderDate]) = 1 THEN Detail.QuantityOrdered END) AS 'January'
        , SUM(CASE WHEN Month([Header.OrderDate]) = 2 THEN Detail.QuantityOrdered END) AS 'February'
        , SUM(CASE WHEN Month([Header.OrderDate]) = 3 THEN Detail.QuantityOrdered END) AS 'March'        
    FROM Detail
    INNER JOIN Header ON Detail.SalesOrderNo = Header.SalesOrderNo
    WHERE Header.OrderDate >= dateadd("m", - 4, DATE ())
    GROUP BY Detail.ItemCode
    ORDER BY Detail.ItemCode;

编辑:看起来 Transform 已经动态处理了它,像这样:

TRANSFORM SUM(Detail.QuantityOrdered)
SELECT Detail.ItemCode
FROM Detail
INNER JOIN Header ON Detail.SalesOrderNo = Header.SalesOrderNo
WHERE Header.OrderDate >= dateadd("m", - 4, DATE ())
GROUP BY Detail.ItemCode
PIVOT MonthName(Month([Header.OrderDate]))

不确定它是否会处理 PIVOT 中的函数,您可能需要一个子查询来获取月份名称或其他解决方法。