2015-01-21 6 views
0

Я так старался понять, как создать сводную таблицу в SQL, но я не могу это сделать!SQL Pivot Table dynamic

У меня есть следующие столбцы:

link_id route_section date_1 StartHour  AvJT data_source 
....... ............. ....... ........... ...... ............ 

С 600000 строк данных.

Мне нужны они в следующей сводной таблице;

  • date_1 StartHour как заголовки столбцов
  • link_id в строке заголовка
  • AvJT как данные
  • с data_source = '1' в качестве фильтра.

PIVOT ТАБЛИЦА

Link_ID 
date_1  StartHour 00001a 000002a 000003a 000004a 
20/01/2014 8   456  4657  556  46576 
21/01/2014 8   511  4725  601  52154 
22/01/2014 8   468  4587  458  47585 
23/01/2014 8   456  4657  556  46576 
24/01/2014 8   456  4657  556  46576 
25/01/2014 8   456  4657  556  46576 
26/01/2014 8   456  4657  556  46576 

мне удалось получить следующий код, это работает, но только дает мне дата_1, как заголовок столбца и не StartHour дополнительно, или с фильтром, как date_source = ' 1' .

Use [C1_20132014] 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(Link_ID) 
FROM (SELECT DISTINCT Link_ID FROM C1_May_Routes) AS Link_ID 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT Date_1, ' + @ColumnName + ' 
    FROM C1_May_Routes 
    PIVOT(SUM(AvJT) 
      FOR Link_ID IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

Спасибо за любую помощь,

Генри

+0

Можете ли вы предоставить ссылку на то, где она была разрешена в другом месте? – chridam

+0

Я думаю, что это - http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – hc91

+0

Смотрите это сообщение: http://sqlhints.com/2014/03/18/dynamic-pivot-in -sql-server/ –

ответ

1

Здесь вы выберите значения в столбце, чтобы показать, как колонки в стержне

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + AvJT + ']', '[' + AvJT + ']') 
       FROM (SELECT DISTINCT AvJT FROM YourTable) PV 
       ORDER BY AvJT 

Теперь поворот в запросе

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT date_1, StartHour,AvJT, data_source 
       FROM YourTable 
      ) x 
      PIVOT 
      (
       -- Values in each dynamic column 
       SUM(data_source) 
       FOR AvJT IN (' + @cols + ')      
      ) p;' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результата

Если вы хотите сделать это, чтобы имена столбцов не являются динамическими, вы можете сделать ниже запрос

SELECT DATE_1,STARTHOUR, 
MIN(CASE WHEN AvJT='00001a' THEN data_source END) [00001a], 
MIN(CASE WHEN AvJT='00002a' THEN data_source END) [00002a], 
MIN(CASE WHEN AvJT='00003a' THEN data_source END) [00003a], 
MIN(CASE WHEN AvJT='00004a' THEN data_source END) [00004a] 
FROM YOURTABLE 
GROUP BY DATE_1,STARTHOUR 
  • Click here для просмотра результата

EDIT:

Я обновляю ваш обновленный вопрос.

Объявляем переменную для фильтрации data_source

DECLARE @DATASOURCE VARCHAR(20) = '1' 

Вместо QUOTENAME, вы можете использовать другой формат, чтобы получить столбцы для поворота

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']') 
       FROM (SELECT DISTINCT Link_ID FROM C1_May_Routes WHERE [email protected]) PV 
       ORDER BY Link_ID 

Теперь стержень

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       -- We will select the data that has to be shown for pivoting 
       -- with filtered data_source 
       SELECT date_1, StartHour,AvJT, Link_ID 
       FROM C1_May_Routes 
       WHERE data_source = '[email protected]+' 
      ) x 
      PIVOT 
      (
       -- Values in each dynamic column 
       SUM(AvJT) 
       -- Select columns from @cols 
       FOR Link_ID IN (' + @cols + ')      
      ) p;' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результата
+0

Спасибо за ваш ответ, я не могу заставить его работать! – hc91

+0

Что случилось? В чем проблема, с которой вы столкнулись? @ hc91 –

+0

Мне нужно, чтобы AvJT был данными, заполняющими таблицу. Data_source просто должен быть фильтром, поэтому я могу сделать 4 разных таблицы - источник 1, источник 2 и т. Д. Это должны быть переменные, которые входят в таблицу - Date_1 smalldatetime, StartHour smallint, Link_ID VARCHAR (50), AvJT int – hc91

0

Кросс-таблица будет примерно такой. FWIW, я бы рекомендовал использовать лучшие имена столбцов, чем 00001a. Дайте названиям столбцов какое-то значение, чтобы с ними было легче работать.

with SortedData as 
(
    SELECT date_1 
     , StartHour 
     , AvJT 
     , data_source 
     , ROW_NUMBER() over (partition by date_1 order by AvJT) AS RowNum 
    FROM YourTable 
) 

select date_1 
    , StartHour 
    , MAX(case when RowNum = 1 then AvJT end) as [00001a] 
    , MAX(case when RowNum = 2 then AvJT end) as [00002a] 
    , MAX(case when RowNum = 3 then AvJT end) as [00003a] 
    , MAX(case when RowNum = 4 then AvJT end) as [00004a] 
from SortedData 
+0

О, я вижу, извинения. Имена столбцов - link_id, и их около 6000. – hc91