我有一张表(消费)如下:
DocDate ItemCode Quantity
01.01.09 A 5
02.01.09 A 6
等等......全年
我需要的结果如下:
ItemCode Jan09Total Feb09Total Mar09Total
问题是数量应该总结为几个月,应该是列,并根据给定日期标准,例如从1月到3月09或2月到7月等等。
如何使用递归查询实现此目的。
由于 拉胡
答案 0 :(得分:2)
假设您使用支持PIVOT的数据库,您应该使用它。以下是Oracle的示例代码:
CREATE TABLE Consumption (
DocDate DATE,
ItemCode VARCHAR2(10),
Quantity NUMBER
);
INSERT INTO Consumption VALUES(to_date('2009-01-01', 'YYYY-MM-DD'), 'A', 5);
INSERT INTO Consumption VALUES(to_date('2009-02-01', 'YYYY-MM-DD'), 'A', 6);
INSERT INTO Consumption VALUES(to_date('2009-01-01', 'YYYY-MM-DD'), 'B', 5);
SELECT * FROM Consumption
PIVOT(
sum(Quantity)
FOR DocDate IN (
to_date('2009-01-01', 'YYYY-MM-DD') AS Jan09Total,
to_date('2009-02-01', 'YYYY-MM-DD') AS Feb09Total
)
);
如Robin所述,如果您的列有所不同,那么您必须使用正确的列动态生成此类查询。
答案 1 :(得分:1)
嗯,这不是递归的,但这会得到你想要的东西:
SELECT
DateName(month, DocDate) + ' ' + CAST(YEAR(DocDate) AS VARCHAR(10)) AS MonthYear,
ItemCode,
SUM(Quantity)
FROM
Consumption
GROUP BY
DateName(month, DocDate) + ' ' + CAST(YEAR(DocDate) AS VARCHAR(10)) AS MonthYear,
ItemCode
ORDER BY
1,2
我认为递归只会妨碍此查询的性能。你确定要这么做吗?或者这只是作业?
答案 2 :(得分:0)
您可以使用PIVOT将数据添加到列中,但是,需要事先定义列的列表。因此,您需要为所需的列构建一些动态SQL(基于您的日期范围),然后运行它以生成PIVOT。
答案 3 :(得分:0)
这是在KNOWN x轴值上实现枢轴逻辑的一种非常优雅的方式的链接。动态支点更难。
我没有完全阅读这篇文章,所以如果没有用,请查看“The Rozenshtein Method”
http://www.stephenforte.net/default.aspx?date=2003-08-07
我在很多查询中都使用过这个结果。