SQL Pivot в этом случае? - PullRequest
       6

SQL Pivot в этом случае?

0 голосов
/ 05 октября 2011

Я пытаюсь сделать это

DATE             Insurance  Type    Billed  Rate
2/28/2011 0:00   BC/BS      INP     B       0.6383
2/28/2011 0:00   BC/BS      OUT     B       0.5216
2/28/2011 0:00   BC/BS      INP     U       0.1988
2/28/2011 0:00   BC/BS      OUT     U       0.3493
3/31/2011 0:00   BC/BS      INP     B       0.69
3/31/2011 0:00   BC/BS      OUT     B       0.6136
3/31/2011 0:00   BC/BS      INP     U       0.1877
3/31/2011 0:00   BC/BS      OUT     U       0.3567

Похоже на это

Insurance   Type    Billed  2/28/2011 0:00  3/31/2011 0:00
BC/BS       INP     B       0.6383           0.69
BC/BS       OUT     B       0.5216           0.6136
BC/BS       INP     U       0.1988           0.1877
BC/BS       OUT     U       0.3493           0.3567

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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 августа 2012

Исходя из предоставленных вами образцов данных, я предполагаю, что у вас будет длинный список дат, которые вам нужно будет преобразовать в столбцы. Хотя вы можете использовать статический стержень, как и другой ответ, вы можете использовать динамический стержень, подобный приведенному ниже:

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

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

set @query 
      = 'SELECT Insurance, [Type], Billed,' + @cols + ' from 
         (
            SELECT [date], 
               Insurance, 
               [Type], 
               Billed, 
               Rate 
            FROM test
         ) x
         pivot 
         (
            sum(Rate)
            for [date] in (' + @cols + ')
         ) p 
         order by billed'

execute(@query)

См. SQL Fiddle с демоверсией

0 голосов
/ 06 октября 2011

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

declare @t table (date datetime, Insurance varchar(10), Type char(3), Billed char(1), Rate decimal(10,4));

    insert into @t
        values  ('2/28/2011 0:00',   'BC/BS',      'INP',     'B',       '0.6383'),
                ('2/28/2011 0:00',   'BC/BS',      'OUT',     'B',       '0.5216'),
                ('2/28/2011 0:00',   'BC/BS',      'INP',     'U',       '0.1988'),
                ('2/28/2011 0:00',   'BC/BS',      'OUT',     'U',       '0.3493'),
                ('3/31/2011 0:00',   'BC/BS',      'INP',     'B',       '0.69'),
                ('3/31/2011 0:00',   'BC/BS',      'OUT',     'B',       '0.6136'),
                ('3/31/2011 0:00',   'BC/BS',      'INP',     'U',       '0.1877'),
                ('3/31/2011 0:00',   'BC/BS',      'OUT',     'U',       '0.3567')

    select  *
    from    (   select  [date] as pivot_col, 
                        Insurance, 
                        [Type], 
                        Billed, 
                        Rate 
                from    @t
            ) as d
    pivot   (   sum(Rate) for pivot_col in ([2/28/2011],[3/31/2011])
            ) as p;

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

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