Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 поворот таблицы  [new]
vacian
Guest
Есть таблица, как можно вывести поля из столбца в строку?
21 июн 14, 23:42    [16201531]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
_TempFox_
Member

Откуда: из норы
Сообщений: 33
Читали help по pivot и unpivot?
21 июн 14, 23:48    [16201542]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
vacian
Guest
Для pivot нужна агрегатная функция. А как быть если в столбце просто перечень значений атрибутов справочника, которые нужно вывести с привязкой к конкретному элементу справочника?
22 июн 14, 00:15    [16201633]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8811
Ну так сделайте фиктивное агрегирование.
22 июн 14, 03:40    [16202127]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
pivot,unpivot

или

case when
23 июн 14, 00:08    [16204024]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
yaxta,

к стате

если обем таблиц оцен больших

исползуйте

CASE  WHEN 
23 июн 14, 11:21    [16205312]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9830
yaxta
к стате

если обем таблиц оцен больших

исползуйте

CASE  WHEN 
pivot - это синтаксический сахар. Запросы с ним приводятся к case when. Так что объем данных роли не играет.
23 июн 14, 11:33    [16205378]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
yaxta
Member

Откуда: азербайджан,баку
Сообщений: 518
invm
yaxta
к стате

если обем таблиц оцен больших

исползуйте

CASE  WHEN 
pivot - это синтаксический сахар. Запросы с ним приводятся к case when. Так что объем данных роли не играет.



Для больших таблиц запрос будет быстрее:

SUM(CASE t1 WHEN 1 THEN amount ELSE 0 END) as test1
23 июн 14, 11:39    [16205422]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
invm
Member

Откуда: Москва
Сообщений: 9830
yaxta
Для больших таблиц запрос будет быстрее:
Не читатель...
23 июн 14, 11:45    [16205461]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
vacian
Для pivot нужна агрегатная функция. А как быть если в столбце просто перечень значений атрибутов справочника, которые нужно вывести с привязкой к конкретному элементу справочника?


Просто поставьте MAX от ваших столбцов. Аггрегировать надо по группе тех строк, которые вы разворачиваете. У вас есть два ключа: ключ группы строк и ключ отдельной строки. Вы группируете по первому.
23 июн 14, 13:34    [16206181]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
yaxta
invm
пропущено...
pivot - это синтаксический сахар. Запросы с ним приводятся к case when. Так что объем данных роли не играет.



Для больших таблиц запрос будет быстрее:

SUM(CASE t1 WHEN 1 THEN amount ELSE 0 END) as test1


CASE это фикция, которая эквивалентна PIVOT. Вы, скорее всего, не правы. Производительность скорее всего, будет одинакова, запись более громоздкой у CASE
23 июн 14, 13:36    [16206197]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin
CASE это фикция, которая эквивалентна PIVOT
Жги дальше!
invm
yaxta
Для больших таблиц запрос будет быстрее:
Не читатель...
Ну вообще-то, если перефразировать, то, если не думать головой, то PIVOT-ом можно вляпаться в лишние затраты.
Ибо он хавает все оставшиеся колонки в агрегирующую часть.
Используя CASE нужно явно указывается что нужно в GROUP BY
Ну и с CASE можно агрегировать по нескольким разворачиваемым группам/колонкам/значениям.
И не всегда с PIVOT писанины меньше, из-за вот этих побочных явлений.
23 июн 14, 17:48    [16208241]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Я полазил по блогам. Мнения противоречивы. Больше всего вызывает доверия вот этот блог

http://www.sqlservercentral.com/articles/T-SQL/63681/

Он утверждает, что PIVOT проигрывает SELECT CASE , но не намного. Остаётся верным то, что PIVOT даёт более компактную запись и логические (алгоритмически) он эквивалентен SELECT CASE.
23 июн 14, 18:12    [16208381]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin
Я полазил по блогам. Мнения ...
Не надо куда либо лазить, хватает посмотреть план запроса.
И там английским по белому видно, что PIVOT это синтаксический сахар который преобразуется в конкретную комбинацию GROUP BY + CASE.

Удивительно, что специалист, вместо того чтобы понимать кухню, и знать как внутрях фунчиклирует, лазает по каким-то там мнениям. Тем более по всяким sqlservercentral ...
23 июн 14, 19:59    [16208738]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Mnior
a_voronin
Я полазил по блогам. Мнения ...
Не надо куда либо лазить, хватает посмотреть план запроса.
И там английским по белому видно, что PIVOT это синтаксический сахар который преобразуется в конкретную комбинацию GROUP BY + CASE.

Удивительно, что специалист, вместо того чтобы понимать кухню, и знать как внутрях фунчиклирует, лазает по каким-то там мнениям. Тем более по всяким sqlservercentral ...


Коли вы такой специалист, то объясните публике, если это GROUP BY + CASE, то почему он должен проигрывать напрямую расписанному GROUP BY + CASE.
23 июн 14, 20:42    [16208815]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Насчёт
Mnior
a_voronin
CASE это фикция, которая эквивалентна PIVOT
Жги дальше!


Выполните сей скрипт с включенным планом под SQL_2012 и убедитесь, что PIVOT и SELECT CASE дают идентичный план и идентичны по производительности. И неча гнать без толку.

DECLARE @T TABLE (N BIGINT NOT NULL, N_ As N % 5 PERSISTED);

WITH N100 AS 
( -- цифры от 0 до 99
	SELECT 0 AS N
	UNION ALL 
	SELECT N100.N + 1 FROM N100
	WHERE N100.N < 99
) 
INSERT INTO @T(N)
SELECT N = N1.N + N2.N * CAST(100 AS BIGINT)+ N3.N * CAST(10000 AS BIGINT) + N4.N * CAST(100000 AS BIGINT) FROM N100 AS N1, N100 AS N2, N100 AS N3, N100 AS N4
WHERE N4.N < 10
--ORDER BY N

SELECT 
	N0 = SUM(CASE WHEN N_ = 0 THEN CAST(N AS BIGINT) END),
	N1 = SUM(CASE WHEN N_ = 1 THEN CAST(N AS BIGINT) END),
	N2 = SUM(CASE WHEN N_ = 2 THEN CAST(N AS BIGINT) END),
	N3 = SUM(CASE WHEN N_ = 3 THEN CAST(N AS BIGINT) END),
	N4 = SUM(CASE WHEN N_ = 4 THEN CAST(N AS BIGINT) END)
FROM @T 



SELECT 
	[0], [1], [2], [3], [4]
FROM (SELECT N = CAST(N AS BIGINT), N_ FROM @T) AS SourceTable
PIVOT
(
	SUM(N) FOR N_ IN ([0], [1], [2], [3], [4])
) AS PivotTable;
23 июн 14, 21:12    [16208882]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin, милок, я уже 3й раз тебе намекаю ,что ты страдаешь стандартной проблемой гуманитария.
Частное не может доказывать общее.
Поэтому даже смотреть твой код нет смысла, хотя там примитив. Молодец, умеешь писать PIVOT.
Надеюсь заметил что надо было обвернуть вышестоящие в отдельный под-запрос, ухудшая читабельность запроса, особенно когда нужны кучи связок в реальных задачах.
+ a_voronin
Если бы ты получил "пинка" в детстве, что тогда вынудило научится применять критическое отношение к себе, и тогда бы не наступал на "уже болезненные" бы грабли.

А вот частное может опровергать общее. Что легко демонстрируется:
+ Код
CREATE TABLE #Test ([Key] Int NOT NULL, [Type] TinyInt NOT NULL, [Value] Int NOT NULL, A VarChar(50), B VarChar(50), C VarChar(50), D VarChar(50), E VarChar(50), F VarChar(50), G VarChar(50), H VarChar(50));
CREATE UNIQUE INDEX UX_#Test ON #Test ([Key],[Type]) INCLUDE ([Value]);
GO
INSERT	#Test
SELECT	Top(100000) V1.number*256 + V2.low, V2.high, Row_Number()OVER(ORDER BY V1.number,V2.number), Replicate('A',50), Replicate('B',50), Replicate('C',50), Replicate('D',50), Replicate('E',50), Replicate('F',50), Replicate('G',50), Replicate('H',50)
FROM	master.dbo.spt_values	V1 CROSS
JOIN	master.dbo.spt_values	V2
WHERE	V1.Type = 'P'
AND	V2.Type = 'P'

SELECT	[Key]
,	Max(CASE WHEN [Type] =   1 THEN Value END)	AS   [1]
,	Max(CASE WHEN [Type] =   2 THEN Value END)	AS   [2]
,	Max(CASE WHEN [Type] =   4 THEN Value END)	AS   [4]
,	Max(CASE WHEN [Type] =   8 THEN Value END)	AS   [8]
,	Max(CASE WHEN [Type] =  16 THEN Value END)	AS  [16]
,	Max(CASE WHEN [Type] =  32 THEN Value END)	AS  [32]
,	Max(CASE WHEN [Type] =  64 THEN Value END)	AS  [64]
,	Max(CASE WHEN [Type] = 128 THEN Value END)	AS [128]
FROM	#Test
GROUP BY [Key]

SELECT	P.[Key]
,	[1]
,	[2]
,	[4]
,	[8]
,	[16]
,	[32]
,	[64]
,	[128]
FROM	#Test
PIVOT	(Max(Value) FOR [Type] IN ([1],[2],[4],[8],[16],[32],[64],[128])) P
GO
DROP TABLE #Test;
Планы и следовательно затраченные ресурсы разные. (не утоните в агрегирующих предикатах).
Прострелить ногу можно? Можно.
ЧТД.

Но если бы тыл был не чукчей, то заметил что я и другие написали выше:
invm
pivot - это синтаксический сахар. Запросы с ним приводятся к case when.
Mnior
И там английским по белому видно, что PIVOT это синтаксический сахар который преобразуется в конкретную комбинацию GROUP BY + CASE
Но никак не наоборот, и никак то что вы очередной раз ляпнули:
a_voronin
CASE это фикция, которая эквивалентна PIVOT
Хотя не замечать, что думают другие ...
+ a_voronin, Какая боль, Аргентина - Ямайка 5:0.
a_voronin
И неча гнать без толку.
Согласен, толку с вас мало. ;)
Пока гоните и ляпаете вы тут, на всём форуме. А так недалеко как погонят вас, с форума.

Но мы все за вас болеем, не вешайте нос.
Но да, я придираюсь. Хотя, я изначально удостоил этому всего два слова.
24 июн 14, 03:29    [16209630]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Mnior
a_voronin, милок, я уже 3й раз тебе намекаю ,что ты страдаешь стандартной проблемой гуманитария.
Частное не может доказывать общее.
Поэтому даже смотреть твой код нет смысла, хотя там примитив. Молодец, умеешь писать PIVOT.
Надеюсь заметил что надо было обвернуть вышестоящие в отдельный под-запрос, ухудшая читабельность запроса, особенно когда нужны кучи связок в реальных задачах.
+ a_voronin
Если бы ты получил "пинка" в детстве, что тогда вынудило научится применять критическое отношение к себе, и тогда бы не наступал на "уже болезненные" бы грабли.

А вот частное может опровергать общее. Что легко демонстрируется:
+ Код
CREATE TABLE #Test ([Key] Int NOT NULL, [Type] TinyInt NOT NULL, [Value] Int NOT NULL, A VarChar(50), B VarChar(50), C VarChar(50), D VarChar(50), E VarChar(50), F VarChar(50), G VarChar(50), H VarChar(50));
CREATE UNIQUE INDEX UX_#Test ON #Test ([Key],[Type]) INCLUDE ([Value]);
GO
INSERT	#Test
SELECT	Top(100000) V1.number*256 + V2.low, V2.high, Row_Number()OVER(ORDER BY V1.number,V2.number), Replicate('A',50), Replicate('B',50), Replicate('C',50), Replicate('D',50), Replicate('E',50), Replicate('F',50), Replicate('G',50), Replicate('H',50)
FROM	master.dbo.spt_values	V1 CROSS
JOIN	master.dbo.spt_values	V2
WHERE	V1.Type = 'P'
AND	V2.Type = 'P'

SELECT	[Key]
,	Max(CASE WHEN [Type] =   1 THEN Value END)	AS   [1]
,	Max(CASE WHEN [Type] =   2 THEN Value END)	AS   [2]
,	Max(CASE WHEN [Type] =   4 THEN Value END)	AS   [4]
,	Max(CASE WHEN [Type] =   8 THEN Value END)	AS   [8]
,	Max(CASE WHEN [Type] =  16 THEN Value END)	AS  [16]
,	Max(CASE WHEN [Type] =  32 THEN Value END)	AS  [32]
,	Max(CASE WHEN [Type] =  64 THEN Value END)	AS  [64]
,	Max(CASE WHEN [Type] = 128 THEN Value END)	AS [128]
FROM	#Test
GROUP BY [Key]

SELECT	P.[Key]
,	[1]
,	[2]
,	[4]
,	[8]
,	[16]
,	[32]
,	[64]
,	[128]
FROM	#Test
PIVOT	(Max(Value) FOR [Type] IN ([1],[2],[4],[8],[16],[32],[64],[128])) P
GO
DROP TABLE #Test;
Планы и следовательно затраченные ресурсы разные. (не утоните в агрегирующих предикатах).
Прострелить ногу можно? Можно.
ЧТД.

Но если бы тыл был не чукчей, то заметил что я и другие написали выше:
invm
pivot - это синтаксический сахар. Запросы с ним приводятся к case when.
Mnior
И там английским по белому видно, что PIVOT это синтаксический сахар который преобразуется в конкретную комбинацию GROUP BY + CASE
Но никак не наоборот, и никак то что вы очередной раз ляпнули:
a_voronin
CASE это фикция, которая эквивалентна PIVOT
Хотя не замечать, что думают другие ...
+ a_voronin, Какая боль, Аргентина - Ямайка 5:0.
a_voronin
И неча гнать без толку.
Согласен, толку с вас мало. ;)
Пока гоните и ляпаете вы тут, на всём форуме. А так недалеко как погонят вас, с форума.

Но мы все за вас болеем, не вешайте нос.
Но да, я придираюсь. Хотя, я изначально удостоил этому всего два слова.


1) Я ничего не ляпал и заявление PIVOT это синтаксический сахар который преобразуется в конкретную комбинацию GROUP BY + CASE не отрицал, а вам почему-то видится, что я что-то отрицаю.
2) Второе, если вы не будете поясничать и хамить, то можно сделать интересные выводы. См ниже.
24 июн 14, 12:50    [16211275]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
А теперь сударь, позвольте указать, где вы облажались с вашим запросом. Я немного переписал ваш PIVOT и запросы стали практически эквивалентными по ресурсам и плану. Просто Ваш PIVOT не подхватил индекс. Я заставил его это сделать.

Так что я остаюсь при своём мнении, PIVOT эквивалентен SELECT CASE (или если проигрывает, то на очень небольшие проценты), если обеспечить правильное использование индексов.

CREATE TABLE #Test ([Key] Int NOT NULL, [Type] TinyInt NOT NULL, [Value] Int NOT NULL, A VarChar(50), B VarChar(50), C VarChar(50), D VarChar(50), E VarChar(50), F VarChar(50), G VarChar(50), H VarChar(50));
CREATE UNIQUE INDEX UX_#Test ON #Test ([Key],[Type]) INCLUDE ([Value]);
GO
INSERT	#Test
SELECT	Top(100000) V1.number*256 + V2.low, V2.high, Row_Number()OVER(ORDER BY V1.number,V2.number), Replicate('A',50), Replicate('B',50), Replicate('C',50), Replicate('D',50), Replicate('E',50), Replicate('F',50), Replicate('G',50), Replicate('H',50)
FROM	master.dbo.spt_values	V1 CROSS
JOIN	master.dbo.spt_values	V2
WHERE	V1.Type = 'P'
AND	V2.Type = 'P'

SELECT	[Key]
,	Max(CASE WHEN [Type] =   1 THEN Value END)	AS   [1]
,	Max(CASE WHEN [Type] =   2 THEN Value END)	AS   [2]
,	Max(CASE WHEN [Type] =   4 THEN Value END)	AS   [4]
,	Max(CASE WHEN [Type] =   8 THEN Value END)	AS   [8]
,	Max(CASE WHEN [Type] =  16 THEN Value END)	AS  [16]
,	Max(CASE WHEN [Type] =  32 THEN Value END)	AS  [32]
,	Max(CASE WHEN [Type] =  64 THEN Value END)	AS  [64]
,	Max(CASE WHEN [Type] = 128 THEN Value END)	AS [128]
FROM	#Test
GROUP BY [Key]

SELECT	P.[Key]
,	[1]
,	[2]
,	[4]
,	[8]
,	[16]
,	[32]
,	[64]
,	[128]
FROM	(SELECT [Key],[Type],[Value] FROM #Test WITH (INDEX= UX_#Test)) A
PIVOT	(Max(Value) FOR [Type] IN ([1],[2],[4],[8],[16],[32],[64],[128])) P
GO
DROP TABLE #Test;
24 июн 14, 12:53    [16211305]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Можно даже хинт убрать

(SELECT [Key],[Type],[Value] FROM #Test) A
24 июн 14, 12:54    [16211310]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin
... вам почему-то видится, что я что-то отрицаю.
Где вам это показалось?
a_voronin
2) Второе, если вы не будете поясничать и хамить
А что, вы будете специально вынуждать и провоцировать?
a_voronin
А теперь сударь, позвольте указать, где вы облажались с вашим запросом.

Это как сказать "Позвольте указать что вы облажались что солнце красное". Я то тут причём? То что существует такой запрос, это от меня никак не зависит. Или вы по своёй стандартной гуманитарной проблеме приписывает мне такой стиль кодирования?

a_voronin
немного переписал ваш PIVOT и запросы стали практически эквивалентными по ресурсам и плану.

И что, от этого первоначальный запрос перестал существовать?
a_voronin, вы вообще понимаете что вы хотите показать?!
Вы понимаете что я хочу показать что PIVOT и явный CASE не эквивалентны в общем случае? И что надо понимать как его писать, что бы не нарваться на указаные в моём примере приколы?
Т.е. вы переписали запрос, но при этом якобы об этом думать и делать не нужно?
a_voronin
Просто Ваш PIVOT не подхватил индекс.
Умора.
1. А почему он его не подхватил?
2. А зачем я привёл вариант когда индекс не может подхватится?
3. Вы думаете проблема только в индексе? Наивный.

a_voronin
Я заставил его это сделать.
О, прям Дон Кихот, какой умный. Пол задачи до вас допёрло.
a_voronin
Так что я остаюсь при своём мнении
Против какого мнения? Приведите его, если вы так усердно настаиваете на своём.

a_voronin
PIVOT эквивалентен SELECT CASE (или если проигрывает, то на очень небольшие проценты), если обеспечить правильное использование индексов.
Т.е. вы утверждаете что вот эти два запроса эквивалентны?:
+ Код такой же что и в прошлый раз, только индекс убран
CREATE TABLE #Test ([Key] Int NOT NULL, [Type] TinyInt NOT NULL, [Value] Int NOT NULL, A VarChar(50), B VarChar(50), C VarChar(50), D VarChar(50), E VarChar(50), F VarChar(50), G VarChar(50), H VarChar(50));
--CREATE UNIQUE INDEX UX_#Test ON #Test ([Key],[Type]) INCLUDE ([Value]);
GO
INSERT	#Test
SELECT	Top(100000) V1.number*256 + V2.low, V2.high, Row_Number()OVER(ORDER BY V1.number,V2.number), Replicate('A',50), Replicate('B',50), Replicate('C',50), Replicate('D',50), Replicate('E',50), Replicate('F',50), Replicate('G',50), Replicate('H',50)
FROM	master.dbo.spt_values	V1 CROSS
JOIN	master.dbo.spt_values	V2
WHERE	V1.Type = 'P'
AND	V2.Type = 'P'

SELECT	[Key]
,	Max(CASE WHEN [Type] =   1 THEN Value END)	AS   [1]
,	Max(CASE WHEN [Type] =   2 THEN Value END)	AS   [2]
,	Max(CASE WHEN [Type] =   4 THEN Value END)	AS   [4]
,	Max(CASE WHEN [Type] =   8 THEN Value END)	AS   [8]
,	Max(CASE WHEN [Type] =  16 THEN Value END)	AS  [16]
,	Max(CASE WHEN [Type] =  32 THEN Value END)	AS  [32]
,	Max(CASE WHEN [Type] =  64 THEN Value END)	AS  [64]
,	Max(CASE WHEN [Type] = 128 THEN Value END)	AS [128]
FROM	#Test
GROUP BY [Key]

SELECT	P.[Key]
,	[1]
,	[2]
,	[4]
,	[8]
,	[16]
,	[32]
,	[64]
,	[128]
FROM	#Test
PIVOT	(Max(Value) FOR [Type] IN ([1],[2],[4],[8],[16],[32],[64],[128])) P
GO
DROP TABLE #Test;
Если он такой эквивалентный, то зачем вы вынуждено переписываете?:
-- из
FROM	#Test
PIVOT	(Max(Value) FOR [Type] IN ([1],[2],[4],[8],[16],[32],[64],[128])) P
-- в
FROM	(SELECT [Key],[Type],[Value] FROM #Test)
PIVOT	(Max(Value) FOR [Type] IN ([1],[2],[4],[8],[16],[32],[64],[128])) P
Зачем? Оно же якобы эквивалентно?!
a_voronin
(или если проигрывает, то на очень небольшие проценты)
У вас все знания такие мутные и где вы не можете связать 3 слова, почему именно так происходит?
a_voronin
1) Я ничего не ляпал
А это что?: 16206197
a_voronin
CASE это фикция, которая эквивалентна PIVOT
Для начала замените вот такой CASE через PIVOT:
SELECT	CASE	WHEN Exists(SELECT * FROM @A) THEN 1
		WHEN Exists(SELECT * FROM @B) THEN 2
		END

От того что вы будете повторять как Псаки что этого якобы нет, оно существовать не перестанет.

Что, тяжело сказать "ну неправильно выразился, я хотел сказать иное"?
24 июн 14, 22:40    [16214161]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
a_voronin
1) Я ничего не ляпал
А это что?: 16206197
a_voronin
CASE это фикция, которая эквивалентна PIVOT
Для начала замените вот такой CASE через PIVOT:
SELECT	CASE	WHEN Exists(SELECT * FROM @A) THEN 1
		WHEN Exists(SELECT * FROM @B) THEN 2
		END

От того что вы будете повторять как Псаки что этого якобы нет, оно существовать не перестанет.

Что, тяжело сказать "ну неправильно выразился, я хотел сказать иное"? [/quot]

Хватит поясничать и делать вид, что вы ничего не понимаете. Речь шла об эквивалентности запросов для поворота данных (кросс-таблиц), написанных через CASE и через PIVOT, а не о том, что любой CASE переписывается через PIVOT. Естественно нет.

Если вы хотите обосновать, что PIVOT проигрывает SELECT CASE, приведите аргументированных пример, где проблема не сводится к тому, что запрос не подхватил индекс, и где отличие существенно. Я слишком много занимался PIVOT и кросс-таблицами, чтобы поверить в ваши заключения.
25 июн 14, 11:51    [16216152]     Ответить | Цитировать Сообщить модератору
 Re: поворот таблицы  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
a_voronin
Хватит поясничать
Кто вы такой чтоб со мной так разговаривать?
a_voronin
и делать вид, что вы ничего не понимаете.
Где?
a_voronin
Речь шла об эквивалентности запросов для поворота данных (кросс-таблиц), написанных через CASE и через PIVOT, а не о том, что любой CASE переписывается через PIVOT. Естественно нет.
Так вам тяжело сказать что вы ошиблись в формулировке? Притом капитально. Никто не обязан догадываться что у вас там было на уме.
И что под белым имелось ввиду чёрное.
Если вам указали что вы ошиблись, или признайте и поправьтесь или катитесь на все 4 стороны, но только не надо наезжать и возмущаться что вас поправляют.
a_voronin
Если вы хотите обосновать, что PIVOT проигрывает SELECT CASE, приведите аргументированных пример
Я привёл вариант.
a_voronin
где проблема не сводится к тому, что запрос не подхватил индекс
1. А чем этот аргумент не катит?
2. Я писал о двух аргументах. Второй: 16208241
Mnior
Ну вообще-то, если перефразировать, то, если не думать головой, то PIVOT-ом можно вляпаться в лишние затраты.
Ибо он хавает все оставшиеся колонки в агрегирующую часть.
Используя CASE нужно явно указывается что нужно в GROUP BY
Ну и с CASE можно агрегировать по нескольким разворачиваемым группам/колонкам/значениям.
И не всегда с PIVOT писанины меньше, из-за вот этих побочных явлений.

a_voronin
и где отличие существенно.
Вы хотите чтобы я показал что использованная при этом излишняя память существенно повлияла на выдачу данных? Это не очевидно?
a_voronin
Я слишком много занимался PIVOT и кросс-таблицами, чтобы поверить в ваши заключения.
Опять "вера". Да какое всем дело до вас? Вы то тут не причём? Разве всё вышеописанное только для вас?
Повторяю, любой несведующий может "вляпаться" если не будет заворачивать всё что до PIVOT в подзапрос с нужным набором колонок. И всего-то что я хотел сказать.

Остальное вы надумали себе сами. Не надо принимать всё сказанное словно всё было описано только для вас лично.
26 июн 14, 13:23    [16222850]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить