【问题标题】:Revenue year by year SQL Server query收入逐年SQL Server查询
【发布时间】:2015-03-23 17:50:59
【问题描述】:

我有以下查询,它为我提供了每个位置的项目和项目详细信息、价值、费率和数量。

我正在尝试根据开始和结束日期获取年收入。例如,如果选择的日期是 2013-2015。最终结果将创建 3 列,一列用于 2013 年收入,一列用于 2014 年收入,一列用于 2015 年收入。

我是一个新手,在编写查询方面仍然不是专家,但这是我目前所拥有的:

SELECT 
   department,
   item,
   itemdesc,
   qty1,
   qty2,
   rate_1,
   rate_2,
   SUM(mm.days*mm.rate*mm.qty)
FROM 
   items it
LEFT JOIN 
   (SELECT 
       i.days, i.rate, i.days, ii.todate, ii.itemid
    FROM 
       invoiceofitems ii
    JOIN 
       invoices i on i.id = ii.id
    WHERE 
       ii.todate BETWEEN @StartDate and @EndDate) mm ON mm.itemid = it.itemid
GROUP BY 
    department,
    item,
    itemdesc,
    qty1, qty2,
    rate_1, rate_2
ORDER BY 
    item

但是,这并没有为我提供我需要的逐年汇总发票收入。

我知道这可以通过迭代来实现。但是我将如何做到这一点,我将从哪里开始呢?

我是否需要知道每年的开始日期和结束日期并对其进行迭代,然后在年份中添加一个计数器,直到 year= EndDate?

我非常困惑。帮助将不胜感激。

【问题讨论】:

  • 为什么要为每一年写一个专栏?为什么不是一行?
  • 这个想法是根据开始和结束日期了解项目每年产生的收入。所以我认为专栏最有意义?我的假设是错误的吗?
  • 我认为把它分成几行是最有意义的。 SQL 列的动态性远低于行。您必须使用动态 SQL 或生成的 SQL 来获取不同数量的列,而使用一行您可以将它们分组并获得您想要的内容
  • 好的,那我怎么通过行呢?
  • 只是按年分组-为什么要按部门和项目等分组?

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2


【解决方案1】:

希望 PIVOT 和 YEAR 能帮助你解决这个问题(有些列省略了):

;WITH SRC(department,item, ... , rate_2, yr, calculation) AS
(SELECT it.department, it.item, ..., it.rate_2,  YEAR(ii.todate) as yr, 
   (i.days * i.rate *i.qty) as calculation
FROM items it
LEFT JOIN invoiceofitems ii ON ii.itemid = it.itemid
JOIN invoices i ON i.id = ii.id)
SELECT department,item, ..., [2013],[2014],[2015]
FROM SRC
PIVOT
(SUM(calculation) FOR yr IN ([2013],[2014],[2015])) PVT

YEAR 函数仅返回日期的“年份”部分,使分组更容易。 PIVOT 只是将分组数据从行旋转到列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多