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

Откуда:
Сообщений: 8
Помогите, пожалуйста, существует таблица, полученная селектом, которую нужно развернуть, как на примере, как это можно сделать? Заранее спасибо

Исходная таблица
Номер Дата
3 dat3-1
3 dat3-2
3 dat3-3
3 dat3-4
3 dat3-6
2 dat2-1
2 dat2-2
2 dat2-3
2 dat2-4
34 dat34-1
34 dat34-3
34 dat34-4
34 dat34-5
34 dat34-6
15 dat15-1
15 dat15-2
15 dat15-3
15 dat15-4
15 dat15-5


Результат

Номер Дата-1 Дата-2 Дата-3 Дата-4 Дата-5 Дата-6
3 dat3-1 dat3-2 dat3-3 dat3-4 NULL dat3-6
2 dat2-1 dat2-2 dat2-3 dat2-4 NULL NULL
34 dat34-1 NULL dat34-3 dat34-4 dat34-5 dat34-6
15 dat15-1 dat15-2 dat15-3 dat15-4 dat15-5 NULL
24 янв 18, 11:37    [21133602]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20189
PIVOT, что ли?
24 янв 18, 11:40    [21133622]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
san4ezko
Member

Откуда:
Сообщений: 8
Akina
PIVOT, что ли?

Может и PIVOT, но, если просто развернуть, то из этого получится большое количество столбцов, а нужно фиксированное
24 янв 18, 11:47    [21133666]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
san4ezko,

CASE ... WHEN
24 янв 18, 11:49    [21133681]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
san4ezko
Member

Откуда:
Сообщений: 8
TaPaK
san4ezko,

CASE ... WHEN

Спасибо, а можно пример? Хотя бы для одного из номеров
24 янв 18, 11:51    [21133696]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
san4ezko
TaPaK
san4ezko,

CASE ... WHEN

Спасибо, а можно пример? Хотя бы для одного из номеров

если вы объясните как две даты могуть быть

34 dat34-1
34 dat34-3
24 янв 18, 11:55    [21133723]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
san4ezko
Member

Откуда:
Сообщений: 8
TaPaK
san4ezko
пропущено...

Спасибо, а можно пример? Хотя бы для одного из номеров

если вы объясните как две даты могуть быть

34 dat34-1
34 dat34-3

Это условный пример, для определенного оборудования (34) есть этапы его производства (всего 6), даты которых как раз записаны
24 янв 18, 12:00    [21133746]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
san4ezko,

т.е. есть ещё где то поле определяющее что это второй этап? или как определить что 1 янв. это 1 этап а 3 янв. это третий :)
24 янв 18, 12:05    [21133766]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
+ Просьба убрать от монитора детей, кошек, беременных и кормящих женщин, и прочих эмоционально и психически нестабильных личностей!
IF OBJECT_ID( 'tempdb..#temp' ) IS NOT NULL
  DROP TABLE #temp
;
CREATE TABLE #temp ( [id] INT, [dat] VARCHAR(10) )
;
INSERT INTO #temp
VALUES
  ( 3,  'dat3-1'  ),
  ( 3,  'dat3-2'  ),
  ( 3,  'dat3-3'  ),
  ( 3,  'dat3-4'  ),
  ( 3,  'dat3-6'  ),
  ( 2,  'dat2-1'  ),
  ( 2,  'dat2-2'  ),
  ( 2,  'dat2-3'  ),
  ( 2,  'dat2-4'  ),
  ( 34, 'dat34-1' ),
  ( 34, 'dat34-3' ),
  ( 34, 'dat34-4' ),
  ( 34, 'dat34-5' ),
  ( 34, 'dat34-6' ),
  ( 15, 'dat15-1' ),
  ( 15, 'dat15-2' ),
  ( 15, 'dat15-3' ),
  ( 15, 'dat15-4' ),
  ( 15, 'dat15-5' )
;
DECLARE @tsql NVARCHAR(MAX) = ''
DECLARE @max INT 
DECLARE @i INT 
;
WITH
t0 AS (
  SELECT
    [cnt] = COUNT(*)
  FROM
    #temp
  GROUP BY
    [id]
)
SELECT
  @max = MAX( [cnt] )
FROM
  t0
;
WITH
n AS (
  SELECT TOP ( @max ) 
    [rn] = ROW_NUMBER() OVER ( ORDER BY 1/0 )
  FROM
    [master]..[spt_values]
)
SELECT TOP ( @max ) 
  @tsql += ',[dat' + CONVERT( VARCHAR, [rn] ) + '] = MAX( CASE WHEN [rn] = ' + CONVERT( VARCHAR, [rn] ) + ' THEN [dat] END )'
FROM
  n
;
SELECT
  @tsql = 'WITH t0 AS ( SELECT [id], [dat], [rn] = ROW_NUMBER() OVER ( PARTITION BY [id] ORDER BY [dat] ) FROM #temp ) SELECT [id]' + @tsql + ' FROM t0 GROUP BY [id]'
;
PRINT @tsql
EXECUTE ( @tsql )  
24 янв 18, 12:11    [21133798]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
san4ezko
Member

Откуда:
Сообщений: 8
TaPaK,

Верно мыслите, виноват, не указал :) Поле достать можно, оно пойдет в основу названий, вот так

Номер Дата Этап
3 dat3-1 1
3 dat3-2 2
3 dat3-3 3
3 dat3-4 4
3 dat3-6 6
2 dat2-1 1
2 dat2-2 2
2 dat2-3 3
2 dat2-4 4
34 dat34-1 1
34 dat34-3 3
34 dat34-4 4
34 dat34-5 5
34 dat34-6 6
15 dat15-1 1
15 dat15-2 2
15 dat15-3 3
15 dat15-4 4
15 dat15-5 5


Номер 1 2 3 4 5 6
3 dat3-1 dat3-2 dat3-3 dat3-4 NULL dat3-6
2 dat2-1 dat2-2 dat2-3 dat2-4 NULL NULL
34 dat34-1 NULL dat34-3 dat34-4 dat34-5 dat34-6
15 dat15-1 dat15-2 dat15-3 dat15-4 dat15-5 NULL
24 янв 18, 12:14    [21133819]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
san4ezko,

SELECT
[Номер],
[1] = CASE WHEN [Этап] = 1 THEN [Дата] END,
[2] = CASE WHEN [Этап] = 2 THEN [Дата] END,
....
FROM <Табл>
24 янв 18, 12:17    [21133841]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
Добрый Э - Эх
Guest
san4ezko,

не совсем MS SQL Server, но пример как раз на твою тему. А синтаксически отличий с My SQL практически нет.
24 янв 18, 12:18    [21133853]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
Добрый Э - Эх
Guest
TaPaK,

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)
24 янв 18, 12:20    [21133869]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
lendenev
Guest
Если совсем в лоб делать, то вот так можно:

create table #t(
	[Номер] int,
	[Дата] varchar(50)
);

insert into #t([Номер], [Дата])
values(3, 'dat3-1'),
(3, 'dat3-2'),
(3, 'dat3-3'),
(3, 'dat3-4'),
(3, 'dat3-6'),
(2, 'dat2-1'),
(2, 'dat2-2'),
(2, 'dat2-3'),
(2, 'dat2-4'),
(34, 'dat34-1'),
(34, 'dat34-3'),
(34, 'dat34-4'),
(34, 'dat34-5'),
(34, 'dat34-6'),
(15, 'dat15-1'),
(15, 'dat15-2'),
(15, 'dat15-3'),
(15, 'dat15-4'),
(15, 'dat15-5');


select 
	[Номер]
	,max(case when right([Дата],1) = '1' then [Дата] else null end) as [1]
	,max(case when right([Дата],1) = '2' then [Дата] else null end) as [2]
	,max(case when right([Дата],1) = '3' then [Дата] else null end) as [3]
	,max(case when right([Дата],1) = '4' then [Дата] else null end) as [4]
	,max(case when right([Дата],1) = '5' then [Дата] else null end) as [5] 
	,max(case when right([Дата],1) = '6' then [Дата] else null end) as [6] 
from #t
group by [Номер];
24 янв 18, 12:21    [21133871]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Добрый Э - Эх
TaPaK,

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)

дык не готовыми ж решениями пихать :)
вообще для тех кто не пишет полное ТЗ есть отдельный котёл )
24 янв 18, 12:23    [21133885]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
san4ezko
Member

Откуда:
Сообщений: 8
Добрый Э - Эх
TaPaK,

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)

как раз таки нет, нужно именно так, как на втором примере
24 янв 18, 12:25    [21133900]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
Добрый Э - Эх
Guest
san4ezko,

да ты не понял.... тут имелось ввиду немного другое - диагональное представление результата....

выполни запрос с агрегатной функцией и без - сам увидишь разницу...
24 янв 18, 12:31    [21133927]     Ответить | Цитировать Сообщить модератору
 Re: Формирование таблицы на основе другой  [new]
san4ezko
Member

Откуда:
Сообщений: 8
Добрый Э - Эх
san4ezko,

да ты не понял.... тут имелось ввиду немного другое - диагональное представление результата....

выполни запрос с агрегатной функцией и без - сам увидишь разницу...

Теперь понял. Нет, есть этапы и есть оборудование, при производстве разного оборудования разные этапы пропускаются (для 3 - этап5, для 34 - этап2), но всего этапов 6, там где пропускается, пусть стоит что угодно, NULL вполне подойдет:)
24 янв 18, 12:37    [21133956]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить