列中的月份总计

时间:2009-06-01 12:08:10

标签: sql sql-server recursion sum

我有一张表(消费)如下:

DocDate   ItemCode    Quantity
01.01.09  A           5
02.01.09  A           6

等等......全年

我需要的结果如下:

ItemCode Jan09Total Feb09Total Mar09Total

问题是数量应该总结为几个月,应该是列,并根据给定日期标准,例如从1月到3月09或2月到7月等等。

如何使用递归查询实现此目的。

由于 拉胡

4 个答案:

答案 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

我在很多查询中都使用过这个结果。