2013-04-08 5 views
0

У меня аналогичный вопрос к предыдущему мой вопрос - Pivot Tables PHP/MySQLPHP SQL Server - динамические строки и столбцы таблицы?

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

Так что есть запрос

select eng, count, weekof from dbo.RPT_ENG_WEEK ('2013-03-03', '2013-03-16', '2013-03-03', '2013-03-16') order by eng, weekof asc 

, что возвращает следующие данные:

eng  count weekof 
James 11  2013-03-03 
James 12  2013-03-10 
Bill 2  2013-03-03 
Gary 15  2013-03-03 
Gary 5  2013-03-10 
Fred 3  2013-03-03 
Fred 2  2013-03-10 

Так что я тогда хотел, чтобы превратить это в один ряд на анг и один столбец на weekof как ниже

week: 2013-03-03 2013-03-10 
James:  11    12  
Bill:  2    0   
Gary:  15    5    
Fred:  3    2 

Ответ, который я получил в своем предыдущем вопросе, создает очарование, если я буду вносить имена of eng как статические строки, но есть, возможно, 100 или около того, на которые он мог бы вернуться, и на самом деле не нужно вручную обновлять список!

Возможно, я мог бы обработать его с помощью курсора в функции SQL, но есть ли лучший способ сделать это?

+0

Ваш другой вопрос был помечен как база данных MySQL, а это SQL Server, какую базу данных вы используете? В обеих версиях код будет сильно отличаться. – Taryn

+2

@bluefeet Да, я знаю - это от SQL Server, а не от MySQL (какой был другой запрос) – franglais

ответ

4

Преобразование данных из строк в столбцы известно как PIVOT. Поскольку вы используете SQL Server, вы можете использовать функцию поворота для получения результата.

Есть несколько способов, которыми вы можете это сделать. Если у вас есть известное число weekof значений, то вы можете жестко закодировать запрос:

select eng, 
    coalesce([2013-03-03], 0) [2013-03-03], 
    coalesce([2013-03-10], 0) [2013-03-10] 
from 
(
    select eng, [count], weekof 
    from RPT_ENG_WEEK 
) d 
pivot 
(
    sum([count]) 
    for weekof in ([2013-03-03], [2013-03-10]) 
) piv; 

См SQL Fiddle with Demo.

Но если у вас есть неизвестное число значений, то вам нужно будет реализовать динамический SQL, чтобы получить результат:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(cast(weekof as date)) 
        from RPT_ENG_WEEK 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsNull = STUFF((SELECT distinct ', coalesce(' + QUOTENAME(cast(weekof as date))+', 0) as '+ QUOTENAME(cast(weekof as date)) 
        from RPT_ENG_WEEK 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT eng, ' + @colsNull + ' 
      from 
      (
       select eng, [count], cast(weekof as date) weekof 
       from RPT_ENG_WEEK 
      ) x 
      pivot 
      (
       sum([count]) 
       for weekof in (' + @cols + ') 
      ) p ' 

execute(@query); 

См SQL Fiddle with Demo. Оба дают результат:

| ENG | 2013-03-03 | 2013-03-10 | 
----------------------------------- 
| Bill |   2 |   0 | 
| Fred |   3 |   2 | 
| Gary |   15 |   5 | 
| James |   11 |   12 | 
+0

Я уверен, что это вуду: D Абсолютно блестящий! – franglais

+0

@ sam.clements LOL, поэтому я хотел подтвердить SQL Server или MySQL, код невероятно отличается, но вы получите тот же результат. – Taryn

+0

Извините за ошибку, но как я могу отобразить это на PHP? Обычно я делал что-то по строкам while ($ obj = sqlsrv_fetch_object ($ stmt)) { $ eng = $ obj-> eng; $ count = $ obj-> count; , а затем отобразите его, но поскольку я не буду знать заголовок столбца или заголовок строки, я не уверен, как я могу его отобразить? – franglais

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