1

我有一张表,其中包含那周的 week_id 和 net_sales (以及许多其他列)。

style_number, week_id, net_sales
ABCD, 1, 100.00
ABCD, 2, 125.00
EFGH, 1, 50.00
EFGH, 2, 75.00

我正在尝试写一个声明,将列出

style_number, net_sales 

为了

MAX(week_id), net_sales for the MAX(week_id)-1 .... , MAX(week_id) - n

所以结果看起来像:

ABCD, 125.00, 100.00
EFGH, 75.00, 50.00

解决这个问题的最佳方法是什么,尤其是当 n 可能相当大时(即回顾 52 周)?

我希望这是有道理的!我正在使用 SQL Server 2008 R2。提前非常感谢!

4

3 回答 3

1

您可以使用PIVOT动态 SQL 来处理您的大量周数

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(week_id)
            FROM sales
            ORDER BY 1 DESC
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'),1,1,'')

SET @sql = 'SELECT style_number, ' + @cols +   
           '  FROM 
            (
              SELECT style_number, week_id, net_sales
                FROM sales
            ) x
            PIVOT 
            (
               MAX(net_sales) FOR week_id IN (' + @cols + ')
            ) p
            ORDER BY style_number'

EXECUTE(@sql)

这是SQLFiddle演示。

于 2013-06-21T05:03:18.217 回答
0

您可以考虑使用以下PIVOT命令: http: //msdn.microsoft.com/en-us/library/ms177410 (v=sql.105).aspx

或者

如果你对结果是一个逗号分隔的列表没意见,你可以像这样使用STUFFandFOR XML命令。

SELECT DISTINCT      
         style_name,

         STUFF(
               (SELECT  ',' + CAST(net_sales AS VARCHAR(20))
               FROM      MyTable AS SubTable
               WHERE      SubTableUser.style = MyTable.style_name
               ORDER BY   week_id DESC --DESC will get your max ID to be first
               FOR XML PATH('')), 1, 1, '') AS net_sales_list

FROM      MyTable
ORDER BY style_name

这将为您提供:

style_name | net_sales_list
---------------------------
ABCD       | 100.00,125.00
EFGH       | 75.00,50.00
于 2013-06-20T23:51:23.457 回答
0

如果您知道周数,因为您使用的是 SQL Server 2008,您可以使用该PIVOT命令,也可以使用MAXwith CASE

MAX这是一个使用with的示例CASE

select 
   style_number, 
   max(case when week_id = 2 then net_sales end) week2sales,
   max(case when week_id = 1 then net_sales end) week1sales
from yourtable
group by style_number

如果您不知道周数,则需要考虑使用动态 SQL。随便搜一下,上面有很多关于SO的帖子。

于 2013-06-21T00:17:33.023 回答