根据日期范围选择列的数据

时间:2013-06-20 23:45:33

标签: sql sql-server sql-server-2008

我有一个表,该周有一个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。非常感谢提前!

3 个答案:

答案 0 :(得分: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 演示。

答案 1 :(得分:0)

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

如果您对结果为逗号分隔列表没有问题,可以使用STUFFFOR 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

答案 2 :(得分:0)

如果您知道周数,那么您使用的是PIVOT

以下是使用MAXCASE

的示例
MAX

如果您不知道周数,则需要考虑使用动态SQL。只需进行搜索,就可以在SO上发布大量帖子。