powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Трансформация таблицы
24 сообщений из 24, страница 1 из 1
Трансформация таблицы
    #40135783
qp10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица:
stand value versionst1 val1 1st2 val2 1st3 val3 1st1 val4 2st3 val52

Как ее преобразовать в таблицу?
stand12st1val1val4st2val2-st3val3val5
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135785
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qp10,
PIVOT?
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135786
qp10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, а есть способы на join?
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135789
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qp10
HandKot, а есть способы на join?

А чем PIVOT не устраивает?
Если что - PIVOT доступен как минимум с 2005-й версии.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135791
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторHandKot, а есть способы на join?
Можно что-то такое нарисовать
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH CTE(STAND,VALUE,VERSION)AS
(
  SELECT 'st1',	'val1',	1 UNION ALL
SELECT 'st2',	'val2',	1 UNION ALL
SELECT 'st3',	'val3',	1 UNION ALL
SELECT 'st1',	'val4',	2 UNION ALL
SELECT'st3',	'val5',	2 
)
SELECT C.STAND,MAX(C2.VALUE)AS[1],MAX(C3.VALUE)AS[2]
FROM CTE AS C
LEFT JOIN CTE AS C2 ON C.STAND=C2.STAND AND C2.VERSION=1
LEFT JOIN CTE AS C3 ON C.STAND=C3.STAND AND C3.VERSION=2
GROUP BY C.STAND
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135795
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
londinium
Можно что-то такое нарисовать

Джойны здесь не нужны:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
;with cte(stand, value, version) as (
  select 'st1', 'val1', 1 union all
  select 'st2', 'val2', 1 union all
  select 'st3', 'val3', 1 union all
  select 'st1', 'val4', 2 union all
  select 'st3', 'val5', 2
)
select
  e.stand,
  max(case e.version when 1 then e.value else null end) [1],
  max(case e.version when 2 then e.value else null end) [2]
from cte e
group by e.stand
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135796
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДжойны здесь не нужны:
Конечно, не нужны, но ТС явно заказал
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135798
ValK412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qp10,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH CTE AS(
  SELECT * FROM (values('st1', 'val1',1),('st2', 'val2', 1),('st3', 'val3',1), ('st1', 'val4', 2), ('st3', 'val5',2)) t(stand,value,version)
)
select st.stand,isnull(c1.value,'-') as v1,isnull(c2.value,'-') as v2,
                      isnull(c3.value,'-') as v3 
from  (select stand from cte group by stand) st
	LEFT JOIN CTE AS C1 ON st.STAND=C1.STAND AND C1.VERSION=1
	LEFT JOIN CTE AS C2 ON st.STAND=C2.STAND AND C2.VERSION=2
	LEFT JOIN CTE AS C3 ON st.STAND=C3.STAND AND C3.VERSION=3


и далее со всеми остановками)
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135802
qp10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эти варианты не адаптируются под динамичность данных исходной таблицы. Например, если появится версия с номером 3, то нужно переписывать запрос
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135803
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qp10
если появится версия с номером 3, то нужно переписывать запрос

Если формировать запрос динамически, то не нужно.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135828
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делать пивоты в SQL - глупость, ИМХО.
Для этого есть гораздо более удобные инструменты: EXCEL, BI.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135885
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Делать пивоты в SQL - глупость, ИМХО.
Для этого есть гораздо более удобные инструменты: EXCEL, BI.


Во как! п-ц

Excel - прямо-таки есть? бесплатный?
pivot есть в sql - так в чем проблема?
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135888
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Excel - прямо-таки есть? бесплатный?А что есть компании, где нет Экселя ? Серьезно ?
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135889
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
pivot есть в sql - так в чем проблема?


В синтаксисе pivot фиксированное число колонок.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135917
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Excel - прямо-таки есть? бесплатный?

Дело не в доступности или бесплатности.
PIVOT может использоваться а) в инлайновой UDF или во VIEW, на основе которых работают какие-то другие функции/представления/ХП; б) результат пивота может использоваться в клиентском приложении, которое к экселю или BI вообще никаким боком. Оба варианта на моей практике встречались достаточно часто.
msLex
В синтаксисе pivot фиксированное число колонок.

И в подавляющем большинстве случаев это число известно.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135924
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
И в подавляющем большинстве случаев это число известно.



Хмм, а как вы посчитали количество случаев когда это известно а когда нет?
Охотно верю, что сам pivot чаще используется именно в случаях с известным количество полей
Только вызвано это именно подобными ограничениями самого pivot.


Если вернутся к текущему примеру, то количество версий не видится фиксированным.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135933
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование pivot закладывается, как правило, при проектировании базы. То есть его результат заранее известен. В прочих случаях лучше использовать преобразование на стороне клиентского приложения, например, для построения посуточной сводки и в таком роде.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135951
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
Excel - прямо-таки есть? бесплатный?
А что есть компании, где нет Экселя ? Серьезно ?

Мы вроде не в Одессе и не на Брайтоне.
Excel - внешний продукт и денег стоит, и не везде естьЮ потому что на *** не нужен
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40135970
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Хмм, а как вы посчитали количество случаев когда это известно а когда нет?

Поскольку количество колонок в пивоте напрямую определяет количество колонок в результирующей выборке, то в случае неизвестного числа колонок в pivot мы имеем дело и с неизвестным количеством колонок в результирующей выборке. Достигается это кодогенерацией, и я не могу припомнить в своей практике особенно большого количества случаев сгенерированных PIVOT. А случаев с обычным статическим PIVOT - сколько угодно.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40136047
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин
Excel - внешний продукт и денег стоит, и не везде есть потому что на *** не нужен
Не нужен. Ну ОК.
По многолетнему опыту скажу, что на самом деле 90% отчетности на*** не нужно. Баловство для манагеров и повышение ЧСВ руководителей среднего звена.
Эта отчетность практически не влияет ни на какие управленческие решения.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40136268
ValK412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны
qp10
если появится версия с номером 3, то нужно переписывать запрос

Если формировать запрос динамически, то не нужно.

Есть ли другие способы для запросов с переменным количеством столбцов в результате, кроме динамической генерации?
Код: 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.
declare @sqlExpr varchar(max)='';
declare @allVersion varchar(4000)='';
declare @allJoin varchar(4000)='';

SELECT *  INTO #tt
FROM (values('st1','val1',1),('st2','val2',1),('st3','val3',1), ('st1',	'val4',	2), ('st3','val5',2),('st3','val6',3)) t(stand,value,version);

select @allVersion=(select 
  STRING_AGG ('isnull(c'+ version +'.value,''-'') as ['+version+']',',') 
   WITHIN GROUP ( ORDER BY version) 
   FROM (select distinct trim(cast(version as char)) as version from #tt) t)
select @allJoin=(select 
  STRING_AGG ( ' left join #tt as c'+ version
              +' on c'+version+'.stand=st.stand'
              +' and c'+version+'.version='+version
              ,char(13)) 
   WITHIN GROUP ( ORDER BY version) 
   FROM (select distinct trim(cast(version as char)) as version from #tt) t)

select @sqlExpr='SELECT st.stand AS stand, '+@allVersion 
+' FROM  (select stand from #tt group by stand) st '+char(13)
+@allJoin

execute (@sqlExpr)

...
Рейтинг: 0 / 0
Трансформация таблицы
    #40136306
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValK412,

реляционная математика не подразумевают существование результирующего набора с неизвестным количеством атрибутов. Даже если вы и сможете такое получить, то это в корне неверно для любой системы, работающей с РСУБД. Вам надо пересмотреть концепции взаимодействия с базой.
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40136448
ValK412
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
ValK412,

реляционная математика не подразумевают существование результирующего набора с неизвестным количеством атрибутов. Даже если вы и сможете такое получить, то это в корне неверно для любой системы, работающей с РСУБД. Вам надо пересмотреть концепции взаимодействия с базой.

Спасибо. Я столь глубоко не заглядывал.
Всегда было противно делать с переменным числом столбцов - казалось, здесь что-то не додумано)
...
Рейтинг: 0 / 0
Трансформация таблицы
    #40136458
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValK412
Владислав Колосов
ValK412,

реляционная математика не подразумевают существование результирующего набора с неизвестным количеством атрибутов. Даже если вы и сможете такое получить, то это в корне неверно для любой системы, работающей с РСУБД. Вам надо пересмотреть концепции взаимодействия с базой.

Спасибо. Я столь глубоко не заглядывал.
Всегда было противно делать с переменным числом столбцов - казалось, здесь что-то не додумано)



С переменным числом столбцов хорошо работают олап-кубы и их языки запросов MDX и DAX. Вот там переменное число и столбцов и строк по полной программе.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Трансформация таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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