Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 строки в колонки с группировкой  [new]
Idol_111
Member

Откуда:
Сообщений: 633
Не могу придумать элегантное решение для следующей задачи:
Дана таблица
codetypeprintcopy
11rem10
11con01
12rem10
12con10

Необходимо получить
coderemcon
11printcopy
12printprint

+ Необходимые скрипты

USE tempdb
GO

CREATE TABLE #source(
	[code] [nvarchar](50) NOT NULL,
	[type] [nvarchar](50) NOT NULL,
	[print] [int] NOT NULL,
	[copy] [int] NOT NULL
) ON [PRIMARY]

GO
INSERT INTO #source
           ([code]
           ,[type]
           ,[print]
           ,[copy])
     VALUES
           (11,'rem',1,0)
          ,(11,'con',0,1)
          ,(12,'rem',1,0)
          ,(12,'con',1,0)
GO


Поделитесь идеями. Заранее благодарен.
13 июл 12, 06:11    [12860431]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
Добрый Э - Эх
Guest
[PIVOT | UNPIVOT]
13 июл 12, 06:27    [12860439]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
Idol_111
Member

Откуда:
Сообщений: 633
Добрый Э - Эх
[PIVOT | UNPIVOT]
Я ищу элегантное решение. PIVOT не работает с текстом напрямую.
13 июл 12, 06:31    [12860440]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
Idol_111
Member

Откуда:
Сообщений: 633
Забыл добавить мое решение:
select code	
	,case
	when rem = 1 then 'PRINT'
	when rem = 2 then 'COPY'
	end rem
	,case
	when con = 1 then 'PRINT'
	when con = 2 then 'COPY'
	end con
from (
	select code
		,type
		  ,case
		  when [print] = 1 then 1
		  when copy = 1 then 2
		  else 3
		  end as value
	from #source
	) as src
pivot
(
sum(value)
for [type] in (rem, con)
) as pvt
13 июл 12, 06:32    [12860443]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
with rem
as
(
select code, case when [print] > copy 
                  then 'print' 
                  else 'copy' end as rem
  from #source
  where type = 'rem'
)
, con
as
(
select code, case when [print] > copy 
                  then 'print' 
                  else 'copy' end as con
  from #source
  where type = 'con'
)
select rem.*, con 
  from rem
    inner join con
      on rem.code = con.code 
13 июл 12, 07:43    [12860502]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
Idol_111
Member

Откуда:
Сообщений: 633
Knyazev Alexey,
Симпатичное решение, большое спасибо.

На таблице без индексов в два раза тяжелее (джойн и два скана на таблицу), чем первое решение. Хотя не ясно, что будет быстрее при наличии индексов, Сортировка в первом случае или Джойн во втором .

Благодарю.
13 июл 12, 08:11    [12860567]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
invm
Member

Откуда: Москва
Сообщений: 9833
with cte as
(
 select
  [code], [type],
  case when [print] = 1 then 'print' else 'copy' end as v
 from
  #source
)
select
 [code], pvt.rem, pvt.con
from
 cte
pivot
(
 max(v)
for [type] in (rem, con)
) as pvt;
13 июл 12, 08:35    [12860619]     Ответить | Цитировать Сообщить модератору
 Re: строки в колонки с группировкой  [new]
Idol_111
Member

Откуда:
Сообщений: 633
invm,
Спасибо.
На мой взгляд, пока самое красивое решение.
16 июл 12, 01:17    [12870545]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить