2013-06-20 82 views
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 

是什么解决这个问题的最好方法,尤其是w母鸡n可能相当大(即回头看52周)?

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

+0

你可以与净销售只是一个逗号分隔列表好吗? – wilsjd

+0

所以....你需要尽可能多的列,因为你的某些style_nymbers有几周? – Lamak

+0

@wilsjd - 可能会容易得多吗? – Trinculo

回答

0

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

OR

如果你是没事,结果是一个逗号分隔的列表,你可以使用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 
+0

我在“Micrsoft SQL Server 2012 - TSQL Fundamentals”中阅读过这篇文章,听起来好像可能会起作用,但我一直无法使其工作。如果这是最好的方法,我可能会花时间在再次写入之前真正吸收材料。 – Trinculo

+0

看看@ peterm的答案,这是让它工作的一种方法。 'PIVOT'的事情是你必须指定列。动态SQL会让你在那里。 – wilsjd

0

如果你知道周数,因为你使用的是SQL Server 2008中,你可以使用PIVOT命令,或者您可以使用MAXCASE

下面是使用一个例子MAXCASE

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。只要做一个搜索,大量的帖子就可以了。

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演示。