【问题标题】:Month wise totals in columns列中的按月总计
【发布时间】:2009-06-01 12:08:10
【问题描述】:

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

DocDate   ItemCode    Quantity
01.01.09  A           5
02.01.09  A           6

等等..全年

我需要如下结果:

ItemCode Jan09Total Feb09Total Mar09Total

问题是数量应该按月份汇总,应该在列中并根据给定日期标准,例如从 1 月到 3 月 9 日或 2 月到 7 月 9 日等。

p>

如何使用递归查询来实现这一点。

谢谢 拉胡尔

【问题讨论】:

  • 我认为你不需要递归查询来解决这个问题;通常这是针对层次结构中的数据,而您的数据不适合该模型。我会查看一本关于 SQL 技术的书,比如 Anthony Mollinaro 的 SQL Cookbook,以了解有关报告查询的想法。

标签: sql sql-server recursion sum


【解决方案1】:

假设您使用支持 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 所说,如果您的列不同,那么您必须使用正确的列动态生成此类查询。

【讨论】:

    【解决方案2】:

    嗯,它不是递归的,但这会得到你想要的:

    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
    

    我认为递归只会阻碍这个查询的性能。你确定要这样做吗?或者这只是家庭作业?

    【讨论】:

    • 我使用的是SQL Server,这个查询有小错误。例如,没有名为 MonthName 的函数,虽然有一个函数 DateName 可以用来获取月份的名称此外,我需要这样的结果,以便每个月都有一列。
    【解决方案3】:

    您可以根据需要使用 PIVOT 将数据放入列中,但是需要事先定义列列表。因此,您需要为您需要的列(基于您的日期范围)构建一些动态 SQL,然后运行它以生成您的 PIVOT。

    【讨论】:

      【解决方案4】:

      这里是在已知 x 轴值上实现枢轴逻辑的绝妙优雅方式的链接。动态枢轴更难。

      我没有完整阅读这篇文章,所以如果没有帮助,请查看“The Rozenshtein Method”

      http://www.stephenforte.net/default.aspx?date=2003-08-07

      我在很多查询中都使用了这个,结果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        相关资源
        最近更新 更多