2013-02-12 3 views
0

У меня есть таблица со следующими значениями.Сводная динамическая колонка

Date      TCOUNT  COUNT 
02/06/2013 00:00  3500  35 
02/12/2013 00:00  4000  23 
02/21/2013 00:00  1000  54 
02/27/2013 00:00  5000  12 

где Date динамична необходимость цв быть повернута.

мне нужно pivote таблицу выше, чтобы получить результат ниже

02/06/2013 00:00 02/12/2013 00:00 02/21/2013 00:00 02/27/2013 00:00 
35     23     54     12 
3500    4000    1000    5000 

, пожалуйста, помогите.

Спасибо.

+2

** WHAT ** база данных система/продукт/РСУБД ?? –

+0

Возможный дубликат [SQL Server dynamic PIVOT query?] (Http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) –

ответ

2

Основываясь на том, что ваш previous question was tagged with sql server, я предполагаю, что вам нужен синтаксис SQL-сервера.

Для того, чтобы получить результат, вам необходимо использовать функции UNPIVOT и PIVOT. Неавтомобиль возьмет столбцы TCount и Count и преобразует их в строки, а затем PIVOT возьмет dates и преобразует их в столбцы.

Если вы знаете значения раньше времени, то вы можете жестко закодировать запрос:

select * 
from 
(
    select date, value, col 
    from yourtable 
    unpivot 
    (
    value 
    for col in (tcount, count) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for date in ([2013-02-06], [2013-02-12], 
       [2013-02-21], [2013-02-27]) 
) piv; 

См SQL Fiddle with Demo

Однако, если у вас есть неизвестное число дат, то вам необходимо динамическое SQL:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(10), Date, 120)) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT col, ' + @cols + ' from 
      (
       select convert(varchar(10), Date, 120) date, 
        value, col 
       from yourtable 
       unpivot 
       (
        value 
        for col in (tcount, count) 
       ) unpiv 
      ) src 
      pivot 
      (
       max(value) 
       for date in (' + @cols + ') 
      ) p ' 

execute(@query) 

См SQL Fiddle with Demo

Результат обоих:

| COL | 2013-02-06 | 2013-02-12 | 2013-02-21 | 2013-02-27 | 
-------------------------------------------------------------- 
| COUNT |   35 |   23 |   54 |   12 | 
| TCOUNT |  3500 |  4000 |  1000 |  5000 | 
+0

Почему, почему, Microsoft не может дать нам настоящие динамические повороты ? Blearg. – ErikE

+0

@ErikE Я скачу от радости, когда это произойдет. – Taryn

+0

Возможно, это связано с сложными внутренними машинами, которые простые смертные не могут понять без похвалы остроумия от богов. – ErikE