Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Формирование таблицы на основе другой / 18 сообщений из 18, страница 1 из 1
24.01.2018, 11:37
    #39589824
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
Помогите, пожалуйста, существует таблица, полученная селектом, которую нужно развернуть, как на примере, как это можно сделать? Заранее спасибо

Исходная таблиц а
Номер Дата3 dat3-13 dat3-23 dat3-33 dat3-43 dat3-62 dat2-12 dat2-22 dat2-32 dat2-434 dat34-134 dat34-334 dat34-434 dat34-534 dat34-615 dat15-115 dat15-215 dat15-315 dat15-415 dat15-5

Результат

Номер Дата-1 Дата-2 Дата-3 Дата-4 Дата-5 Дата-63 dat3-1 dat3-2 dat3-3 dat3-4 NULL dat3-62 dat2-1 dat2-2 dat2-3 dat2-4 NULL NULL34 dat34-1 NULL dat34-3 dat34-4 dat34-5 dat34-615 dat15-1 dat15-2 dat15-3 dat15-4 dat15-5 NULL
...
Рейтинг: 0 / 0
24.01.2018, 11:40
    #39589831
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
PIVOT, что ли?
...
Рейтинг: 0 / 0
24.01.2018, 11:47
    #39589841
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
AkinaPIVOT, что ли?
Может и PIVOT, но, если просто развернуть, то из этого получится большое количество столбцов, а нужно фиксированное
...
Рейтинг: 0 / 0
24.01.2018, 11:49
    #39589843
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
san4ezko,

CASE ... WHEN
...
Рейтинг: 0 / 0
24.01.2018, 11:51
    #39589845
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
TaPaKsan4ezko,

CASE ... WHEN
Спасибо, а можно пример? Хотя бы для одного из номеров
...
Рейтинг: 0 / 0
24.01.2018, 11:55
    #39589851
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
san4ezkoTaPaKsan4ezko,

CASE ... WHEN
Спасибо, а можно пример? Хотя бы для одного из номеров
если вы объясните как две даты могуть быть

34 dat34-1
34 dat34-3
...
Рейтинг: 0 / 0
24.01.2018, 12:00
    #39589856
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
TaPaKsan4ezkoпропущено...

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

34 dat34-1
34 dat34-3
Это условный пример, для определенного оборудования (34) есть этапы его производства (всего 6), даты которых как раз записаны
...
Рейтинг: 0 / 0
24.01.2018, 12:05
    #39589862
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
san4ezko,

т.е. есть ещё где то поле определяющее что это второй этап? или как определить что 1 янв. это 1 этап а 3 янв. это третий :)
...
Рейтинг: 0 / 0
24.01.2018, 12:11
    #39589869
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
Просьба убрать от монитора детей, кошек, беременных и кормящих женщин, и прочих эмоционально и психически нестабильных личностей!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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 )  

...
Рейтинг: 0 / 0
24.01.2018, 12:14
    #39589875
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
TaPaK,

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

Номер Дата Этап3 dat3-1 13 dat3-2 23 dat3-3 33 dat3-4 43 dat3-6 62 dat2-1 12 dat2-2 22 dat2-3 32 dat2-4 434 dat34-1 134 dat34-3 334 dat34-4 434 dat34-5 534 dat34-6 615 dat15-1 115 dat15-2 215 dat15-3 315 dat15-4 415 dat15-5 5

Номер 1 2 3 4 5 63 dat3-1 dat3-2 dat3-3 dat3-4 NULL dat3-62 dat2-1 dat2-2 dat2-3 dat2-4 NULL NULL34 dat34-1 NULL dat34-3 dat34-4 dat34-5 dat34-615 dat15-1 dat15-2 dat15-3 dat15-4 dat15-5 NULL
...
Рейтинг: 0 / 0
24.01.2018, 12:17
    #39589877
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
san4ezko,

Код: sql
1.
2.
3.
4.
5.
6.
SELECT
[Номер],
[1] = CASE WHEN [Этап] = 1 THEN [Дата] END,
[2] = CASE WHEN [Этап] = 2 THEN [Дата] END,
....
FROM <Табл>
...
Рейтинг: 0 / 0
24.01.2018, 12:18
    #39589881
Формирование таблицы на основе другой
san4ezko,

не совсем MS SQL Server, но пример как раз на твою тему . А синтаксически отличий с My SQL практически нет.
...
Рейтинг: 0 / 0
24.01.2018, 12:20
    #39589889
Формирование таблицы на основе другой
TaPaK,

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)
...
Рейтинг: 0 / 0
24.01.2018, 12:21
    #39589890
lendenev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
Если совсем в лоб делать, то вот так можно:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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 [Номер];
...
Рейтинг: 0 / 0
24.01.2018, 12:23
    #39589895
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
Добрый Э - ЭхTaPaK,

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)
дык не готовыми ж решениями пихать :)
вообще для тех кто не пишет полное ТЗ есть отдельный котёл )
...
Рейтинг: 0 / 0
24.01.2018, 12:25
    #39589902
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
Добрый Э - ЭхTaPaK,

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)
как раз таки нет, нужно именно так, как на втором примере
...
Рейтинг: 0 / 0
24.01.2018, 12:31
    #39589911
Формирование таблицы на основе другой
san4ezko,

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

выполни запрос с агрегатной функцией и без - сам увидишь разницу...
...
Рейтинг: 0 / 0
24.01.2018, 12:37
    #39589918
san4ezko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование таблицы на основе другой
Добрый Э - Эхsan4ezko,

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

выполни запрос с агрегатной функцией и без - сам увидишь разницу...
Теперь понял. Нет, есть этапы и есть оборудование, при производстве разного оборудования разные этапы пропускаются (для 3 - этап5, для 34 - этап2), но всего этапов 6, там где пропускается, пусть стоит что угодно, NULL вполне подойдет:)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Формирование таблицы на основе другой / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]