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
中的函数,您可能需要一个子查询来获取月份名称或其他解决方法。
我想相应地显示每个月的总数量
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
中的函数,您可能需要一个子查询来获取月份名称或其他解决方法。