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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 08.08.2019, 15:13   #1
AleksFromBK
Новичок
 
Регистрация: 08.08.2019
Сообщений: 4
Репутация: 10
По умолчанию Применение 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
Адрес: Северодонецк.ua
Сообщений: 18,855
Репутация: 6688
По умолчанию

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

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

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

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

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

Аватар, всё подтвердилось.
КоличествоМинус = 0 - и проблема исчезла.
Только вопрос остался: почему поле, НИ в чём не участвующее (имея в виду синтаксис и семантику PIVOT), тем не менее влияет на результат?
AleksFromBK вне форума   Ответить с цитированием
Старый 08.08.2019, 18:01   #6
AleksFromBK
Новичок
 
Регистрация: 08.08.2019
Сообщений: 4
Репутация: 10
По умолчанию 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
Адрес: Северодонецк.ua
Сообщений: 18,855
Репутация: 6688
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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


23:34.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru