【问题标题】:Calculate Relation within Query Results计算查询结果中的关系
【发布时间】:2014-02-27 16:25:51
【问题描述】:

我目前遇到如下结果集:

| Month   | LastWeekForMonth | ValueForLastWeekOfMonth |
| 2013-09 |     2013-40      |      981408,27          |
| 2013-10 |     2013-44      |      931209,12          |
| 2013-11 |     2013-48      |      1081302,00         |
| 2013-12 |     2013-52      |      935418,21          |
| 2014-01 |     2014-05      |      911402,11          |
| 2014-02 |     2014-09      |      991201,10          |

我使用以下查询计算:

  SELECT C.Month
        ,RT.[Weekstamp] as LastWeekForMonth
        ,Sum([RevenueValue]) as ValueForLastWeekOfMonth
  FROM [Database].[dbo].[fact_RevenueTable] RT
  INNER JOIN CalenderWeekTable CW on RT.Weekstamp = CW.Weekstamp
  INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
  WHERE RT.Probability <= 1
        AND RT.Weekstamp IN ( 
                             SELECT max(CW.[Weekstamp])
                             FROM [Database].[dbo].[CalenderWeekTable] CW
                             INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
                             WHERE C.Month >= @FromSQLMonth and C.Month < @ToSQLMonth
                             GROUP BY C.Month
                             )
  GROUP BY RT.Weekstamp,C.Month

我现在需要的是:

| Month   | LastWeekForMonth | ValueForLastWeekOfMonth | QuotientToPreviousMonth |
| 2013-09 |     2013-40      |      981408,27          |          1.04           |
| 2013-10 |     2013-44      |      931209,12          |     0.948849880794259   |
| 2013-11 |     2013-48      |      1081302,00         |     1.161180637921587   |
| 2013-12 |     2013-52      |      935418,21          |     0.8650850641171477  |
| 2014-01 |     2014-05      |      911402,11          |     0.9743258151880537  |
| 2014-02 |     2014-09      |      991201,10          |     1.087556292798137   |

所以我需要一个新的列来显示以下之间的商数:

ValueForLastWeekOfMonth / ValueForLastWeekOf上一个月份

现在向你们所有人提出问题,这些问题总是乐于助人的人们:

有没有办法在 SQL 中实现这一点?

由于我想在 SQL Server 中计算(或者如果是,在 SSIS 中),这意味着可以使用 SQL Server 2012 中提供的所有工具。

在此先感谢大家,期待您的回音!

【问题讨论】:

    标签: sql sql-server reporting-services ssis


    【解决方案1】:

    查询:

    SELECT C.Month
            ,RT.[Weekstamp] as LastWeekForMonth
            ,Sum([RevenueValue]) as ValueForLastWeekOfMonth
            ,Sum([RevenueValue])/ 
             LAG(Sum([RevenueValue]))OVER(ORDER BY Month) AS QuotientToPreviousMonth 
      FROM [Database].[dbo].[fact_RevenueTable] RT
      INNER JOIN CalenderWeekTable CW on RT.Weekstamp = CW.Weekstamp
      INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
      WHERE RT.Probability <= 1
            AND RT.Weekstamp IN ( 
                                 SELECT max(CW.[Weekstamp])
                                 FROM [Database].[dbo].[CalenderWeekTable] CW
                                 INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
                                 WHERE C.Month >= @FromSQLMonth and C.Month < @ToSQLMonth
                                 GROUP BY C.Month
                                 )
      GROUP BY RT.Weekstamp,C.Month
    

    结果:

    |                            MONTH | LASTWEEKFORMONTH | VALUEFORLASTWEEKOFMONTH |       COLUMN_3 |
    |----------------------------------|------------------|-------------------------|----------------|
    | September, 01 2013 00:00:00+0000 |          2013-40 |               981408.27 |         (null) |
    |   October, 01 2013 00:00:00+0000 |          2013-44 |               931209.12 | 0.948849880794 |
    |  November, 01 2013 00:00:00+0000 |          2013-48 |                 1081302 | 1.161180637922 |
    |  December, 01 2013 00:00:00+0000 |          2013-52 |               935418.21 | 0.865085064117 |
    |   January, 01 2014 00:00:00+0000 |          2014-05 |               911402.11 | 0.974325815188 |
    |  February, 01 2014 00:00:00+0000 |          2014-09 |                991201.1 | 1.087556292798 |
    

    我认为您可以像这样重写您的查询:

      SELECT a.Month,
             a.LastWeekForMonth,
             a.ValueForLastWeekOfMonth,
             a.ValueForLastWeekOfMonth/ 
             LAG(ValueForLastWeekOfMonth)OVER(ORDER BY a.Month) AS QuotientToPreviousMonth 
      FROM(
      SELECT C.Month
            ,RT.[Weekstamp] as LastWeekForMonth
            ,Sum([RevenueValue]) as ValueForLastWeekOfMonth,
            ROW_NUMBER()OVER(PARTITION BY C.Month ORDER BY RT.Weekstamp DESC) AS rnk
      FROM [Database].[dbo].[fact_RevenueTable] RT
       INNER JOIN CalenderWeekTable CW on RT.Weekstamp = CW.Weekstamp
       INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
      WHERE RT.Probability <= 1
       AND C.Month >= @FromSQLMonth and C.Month < @ToSQLMonth
      GROUP BY RT.Weekstamp,C.Month) a
      WHERE a.rnk = 1
    

    【讨论】:

      【解决方案2】:
      ;WITH YourPostedCode AS
      (
          SELECT C.Month
              ,RT.[Weekstamp] as LastWeekForMonth
              ,Sum([RevenueValue]) as ValueForLastWeekOfMonth
          FROM [Database].[dbo].[fact_RevenueTable] RT
          INNER JOIN CalenderWeekTable CW on RT.Weekstamp = CW.Weekstamp
          INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
          WHERE RT.Probability <= 1
          AND RT.Weekstamp IN ( 
              SELECT max(CW.[Weekstamp])
              FROM [Database].[dbo].[CalenderWeekTable] CW
              INNER JOIN CalenderTable C on CW.KalenderID = C.KalenderID
              WHERE C.Month >= @FromSQLMonth and C.Month < @ToSQLMonth
              GROUP BY C.Month
              )
          GROUP BY RT.Weekstamp,C.Month
      )
      SELECT c.[Month], c.LastWeekForMonth, c.ValueForLastWeekOfMonth,
          ValueForLastWeekOfMonth / Lag(ValueForLastWeekOfMonth) OVER(PARTITION BY NULL
              ORDER BY c.[Month]) AS QuotientToPreviousMonth 
      FROM YourPostedCode c
      

      【讨论】:

      • 非常感谢您的回答,您知道不使用 CTE 的任何选项吗?
      • 1 个问题,最后一行是:FROM YourPostedCode c 这是否意味着我必须执行以下操作:FROM (CODE) AS C ???意思是我必须有两次代码?
      • 无需重复使用代码。 “YourPostedCode”是 CTE 的表达式名称。它在 tsql 中使用,就好像它是一个表名一样。看起来 @Justin 在没有 CTE 的情况下为您提供了一个很好的解决方案。
      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2014-07-04
      • 2014-09-08
      相关资源
      最近更新 更多