Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Web > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 08.08.2019, 15:13   #1
AleksFromBK
Новичок
Джуниор
 
Регистрация: 08.08.2019
Сообщений: 5
По умолчанию Применение PIVOT в t-sql

Господа!
Помогите ответить на один важный для меня вопрос.

Вот фрагмент таблицы "ПродажиПериода":

КодСклада КодНоменклатуры НомерПериода КоличествоПродано КоличествоМинус
10 10485263 1 1.00 0.00
10 10485263 2 2.00 0.00
10 10485263 3 3.00 -1.00
10 10485263 4 4.00 0.00

Вот код, который выбирает эти данные в удобочитаемом виде:

select kk, [1] as p1, [2] as p2, [3] as p3, [4] as p4, [5] as p5, [6] as p6
from
( select cast(КодСклада as varchar(10)) + '/' + cast(КодНоменклатуры as varchar(10)) as kk,
[1], [2], [3], [4], [5], [6]
from dbo.ПродажиПериода
pivot ( sum(КоличествоПродано) for НомерПериода in ([1], [2], [3], [4], [5], [6]) ) as p
) as d
where kk = '10/10485263'

Вот результат работы этого кода:

kk p1 p2 p3 p4 p5 p6
10/10485263 NULL NULL 3.00 NULL NULL NULL
10/10485263 1.00 2.00 NULL 4.00 NULL NULL

Вопрос: почему этот код возвращает ДВЕ записи, а не ОДНУ, как я ожидал?
Ответьте, пожалуйста, кто может.
Заранее благодарен.
AleksFromBK вне форума   Ответить с цитированием
Старый 08.08.2019, 15:59   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Результат группируется не только по КодСклада и КодНоменклатуры, но и по полю КоличествоМинус. 0 вместо -1 засунь - по идее должна одна запись в результате быть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 08.08.2019, 16:23   #3
AleksFromBK
Новичок
Джуниор
 
Регистрация: 08.08.2019
Сообщений: 5
По умолчанию Pivot в t-sql

Спасибо, Аватар.
Я предполагал, что в этом причина (не проверял, но почти уверен),
но задал вопрос в "общем виде".
Теперь вопрос "детальный": я не просил SQL группировать данные по полю КоличествоМинус. Зачем SQL это сделал?
Получается странный вывод. PIVOT корректно можно применять к таблицам, в которых есть 3 группы полей:
1. Поле, по которому выполняется агрегирование
2. Поля, которые выводятся в "графах"
3. Поле(я), которые участвуют в агрегатной функции

Других не может быть? Как минимум - странно...
AleksFromBK вне форума   Ответить с цитированием
Старый 08.08.2019, 16:28   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Цитата:
Сообщение от AleksFromBK Посмотреть сообщение
Других не может быть?
Pivot вообще не от мира сего с дубовым синтаксисом не вписывающимся в привычный sql ) И транспонирование не задача sql сервера, от слова совсем )
Цитата:
Зачем SQL это сделал?
Ну коль не указываются явно поля по которым группировка, то в ней участвуют все поля таблицы, кроме указанных в конструкции pivot. Так задумано видимо )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 08.08.2019 в 16:33.
Аватар вне форума   Ответить с цитированием
Старый 08.08.2019, 16:34   #5
AleksFromBK
Новичок
Джуниор
 
Регистрация: 08.08.2019
Сообщений: 5
По умолчанию

Аватар, всё подтвердилось.
КоличествоМинус = 0 - и проблема исчезла.
Только вопрос остался: почему поле, НИ в чём не участвующее (имея в виду синтаксис и семантику PIVOT), тем не менее влияет на результат?
AleksFromBK вне форума   Ответить с цитированием
Старый 08.08.2019, 18:01   #6
AleksFromBK
Новичок
Джуниор
 
Регистрация: 08.08.2019
Сообщений: 5
По умолчанию PIVOT t-sql

Специально для АВАТАР.
Вы откликнулись на мою проблему и мне хочется представить для вас её решение, которое предложили на другом сайте.
Мне кажется, вам будет любопытно его увидеть.

Автор этого "шедевра" искусственно сузил таблицу dbo.ПродажиПериода до четырёх полей, выбросив поле КоличествоМинус.

select kk, [1] as p1, [2] as p2, [3] as p3, [4] as p4, [5] as p5, [6] as p6
from
( select cast(КодСклада as varchar(10)) + '/' + cast(КодНоменклатуры as varchar(10)) as kk, [1], [2], [3], [4], [5], [6]
from
(select КодСклада, КодНоменклатуры, НомерПериода, КоличествоПродано from dbo.ПродажиПериода) a
pivot ( sum(a.КоличествоПродано) for a.НомерПериода in ([1], [2], [3], [4], [5], [6]) ) as p
) as d
where kk = '10/10485263'

Последний раз редактировалось AleksFromBK; 08.08.2019 в 18:04.
AleksFromBK вне форума   Ответить с цитированием
Старый 08.08.2019, 19:07   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Чего тут искусственного? Вместо таблицы в запросе вложенный запрос, со своим набором полей, обычное решение )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIVOT & СТАТИСТИКА % ПРОЦЕНТЫ Евгений Таб Microsoft Office Excel 3 24.02.2015 11:12
Pivot Table через C# Iriss C# (си шарп) 0 14.10.2014 14:50
Дополнительные вычислений в Power Pivot yailya Microsoft Office Excel 2 01.10.2014 14:37
C# Excel Pivot table CWD C# (си шарп) 1 16.07.2014 00:20
Pivot Run-time Error 1004 stream71 Microsoft Office Excel 0 07.09.2009 15:41