我有一个表,该周有一个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。非常感谢提前!
答案 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
或强>
如果您对结果为逗号分隔列表没有问题,可以使用STUFF
和FOR 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
命
以下是使用MAX
与CASE
:
MAX
如果您不知道周数,则需要考虑使用动态SQL。只需进行搜索,就可以在SO上发布大量帖子。