2013-06-20 4 views
1

У меня есть таблица, которая имеет неделю_ид и 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 n может быть довольно большим (т.е. оглядываясь назад 52 недели)?

Надеюсь, это имеет смысл! Я использую SQL Server 2008 R2. Заранее большое спасибо!

+0

Можете ли вы быть в порядке, когда чистые продажи просто являются списком, разделенным запятой? – wilsjd

+0

Итак ... вы хотите, чтобы столько столбцов, сколько недель на некоторых ваших стилях? – Lamak

+0

@wilsjd - возможно, это будет намного легче сделать? – Trinculo

ответ

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 
+0

Я читал об этом в «Micrsoft SQL Server 2012 - Основы TSQL», и похоже, что это может сработать, но я не смог заставить его работать.Если это лучший способ, я, вероятно, просто потрачу время, чтобы действительно поглотить материал, прежде чем пытаться писать снова. – Trinculo

+0

Посмотрите на ответ @ peterm, это один из способов заставить его работать. Вещь с 'PIVOT' заключается в том, что вы должны указывать столбцы. Динамический SQL доставит вас туда. – wilsjd

0

Если вы знаете, количество недель, так как вы используете SQL Server 2008, вы можете использовать команду PIVOT, или вы можете использовать MAX с CASE :

Вот пример использования MAX с 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 на нем.

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 демо.

Смежные вопросы