Как сводить данные из одной таблицы с SQL Server 2005 - PullRequest
1 голос
/ 09 мая 2009

Я хотел бы создать запрос из одной таблицы со следующими столбцами.

SEQNO - это уникальный ключ

Name   ID   Amount   Date          JOBID       SEQNO
Mark    9    200     1/2/09         1001         1
Peter   3    300     1/2/09         1001         2
Steve   1    200     2/2/09         1001         3
Mark    9    200     3/2/09         1001         4
Peter   3    300     4/2/09         1001         5
Steve   1    200     5/2/09         1001         6
Hally   1    200     5/2/09         1002         7

Запрос должен выводиться в этом формате по SUBJOBID и диапазону дат: -

**NAME      ID      1/2       2/2     3/2     4/2     5/2      JOBID**<br>
Mark        9       200       NULL    200     NULL    NULL     1001   
Peter       3       300       NULL    NULL    300     NULL     1001   
Steve       1       NULL      200     NULL    NULL    200      1001   

Я просматриваю сводные запросы для этого. Но я, кажется, никуда не денусь. Может ли кто-нибудь помочь?

1 Ответ

2 голосов
/ 17 августа 2012

На самом деле это можно сделать довольно легко с помощью функции PIVOT. Так как другой ответ не показывает код, связанный с тем, как его выполнить, вот два способа PIVOT данных.

Сначала с Статическим Пивотом . Статический стержень - это когда вы знаете, что данные заблаговременно превращаются в столбцы.

select *
from 
(
    select name, id, convert(char(5), dt, 101) dt, jobid, amount
    from test
) x
pivot
(
    sum(amount)
    for dt in ([01/02], [02/02], [03/02], [04/05], [05/05])
)p
order by jobid, name

См. Скрипка SQL с демоверсией

Второй способ заключается в использовании Dynamic PIVOT для определения во время выполнения значений, которые необходимо преобразовать в столбцы.

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(5), dt, 101)) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT name, id, ' + @cols + ', jobid from 
             (
                select  name, id, convert(char(5), dt, 101) dt, jobid, amount
                from test
            ) x
            pivot 
            (
                sum(amount)
                for dt in (' + @cols + ')
            ) p 
            order by jobid, name'

execute(@query)

См. SQL Fiddle с демонстрацией

Оба будут давать одинаковые результаты. Динамический отлично работает, когда вы не знаете заранее значения для преобразования в столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...