powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Формирование таблицы на основе другой
18 сообщений из 18, страница 1 из 1
Формирование таблицы на основе другой
    #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
Формирование таблицы на основе другой
    #39589831
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PIVOT, что ли?
...
Рейтинг: 0 / 0
Формирование таблицы на основе другой
    #39589841
san4ezko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaPIVOT, что ли?
Может и PIVOT, но, если просто развернуть, то из этого получится большое количество столбцов, а нужно фиксированное
...
Рейтинг: 0 / 0
Формирование таблицы на основе другой
    #39589843
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
san4ezko,

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

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

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

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

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

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

т.е. есть ещё где то поле определяющее что это второй этап? или как определить что 1 янв. это 1 этап а 3 янв. это третий :)
...
Рейтинг: 0 / 0
Формирование таблицы на основе другой
    #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
Формирование таблицы на основе другой
    #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
Формирование таблицы на основе другой
    #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
Формирование таблицы на основе другой
    #39589881
san4ezko,

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

сейчас ТС следующим вопросом спросит - как ему убрать из выборки строки с пустыми значениями и сжать всё плотно (не то группировка, ни то сортировка)
...
Рейтинг: 0 / 0
Формирование таблицы на основе другой
    #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
Формирование таблицы на основе другой
    #39589895
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхTaPaK,

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

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

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

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

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

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


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