用于3个月数据转换的SQL查询

时间:2015-03-05 05:08:55

标签: sql sql-server-2008 reporting

假设我有一个如下记录集:

ShopNo  Month   Year    ProfitPercentage
  S1     3      2011    25%
  S2     4      2011    35%
  S3     5      2011    36%

从记录中我们可以看到,商店1在2011年的3个月只有一个记录,而其他几个月我们需要假设为0%现在我们需要自动生成其他月份的数据。

ShopNo  Month   Year    ProfitPercentage
   S1    1       2011      0%
   S1    2       2011      0%
   S1    3       2011      25%
   S1    4       2011      0%
   S1    5       2011      0%
   S1    6       2011      0%
   S1    7       2011      0%
   S1    8       2011      0%
   S1    9       2011      0%
   S1    10      2011      0%
   S1    11      2011      0%
   S1    12      2011      0%

同样需要为其他商店生成。除了结果数据之外,我们还需要进行3个月的转换:

  ShopNo    Month   Year    ProfitPercentage
     S1     1-3     2011    25%
     S1     2-4     2011    25%
     S1     3-5     2011    25%
     S1     4-6     2011    0%
     S1     5-7     2011    0%
     S1     6-8     2011    0%
     S1     7-9     2011    0%
     S1     8-10    2011    0%
     S1     9-11    2011    0%
     S1     10-12   2011    0%
     S1     11-1    2012    0%
     S1     12-2    2012    0%

任何人都可以帮我解决这个问题!

1 个答案:

答案 0 :(得分:0)

您可以通过对月/年矩阵进行硬编码来作弊 我不认为你可以在不使用某些静态值的情况下生成它。

从那里开始,应该是GROUP BY的一次短途旅行,其中包含一些/和%来获得3个月的回合。

WITH [Matrix] AS (
SELECT
  [Year].[Value] [Year],
  [Month].[Value] [Month]
FROM
  (SELECT 2011 [Value] UNION SELECT 2012 UNION SELECT 2013 UNION SELECT 2014) [Year]
  OUTER APPLY (SELECT 1 [Value] UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) [Month]
)

SELECT
  M.[Year],
  M.[Month],
  ISNULL(X.[Percentage], 0)
FROM
  [Matrix] M
  LEFT OUTER JOIN (<your query goes here as a subquery>) X