Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Впервые пришлось столкнуться с запросом-перевертышем. Немного "не догоняю". На примерах все понятно. Но мой запрос немного отличается и что делать, уже не знаю.
Прошу помощи. Сразу станет понятнее, когда кто-то укажет на ошибки.
Есть комбинированный запрос:
автор
SELECT
IO.D,
ID.DIFF,
IO.ZM
FROM
dbo.new_INTERPOL_DIFF ID

INNER JOIN dbo.new_INTERPOL_OST IO
ON
IO.ID_DIFF = ID.ID_DIFF
GROUP BY IO.D, ID.DIFF, IO.ZM, ID.KodSyst
HAVING ID.KodSyst = 236

Результат запроса на рисунке Tab1.jpg. Нужно перевернуть столбцы и получить картинку Tab2.jpg.
Вроде до PIVOT справилась - запрос работает. А далее мне не понятно. Никакой агрегатной функции у меня нет. Просто поля. Поле ZM - это выражение - перемножение двух полей в самой таблице, даже не в запросе. Что сделать, чтобы запрос заработал?

К сообщению приложен файл. Размер - 28Kb
26 окт 16, 19:58    [19825572]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Случайно сохранила сообщение, а 1-й рисунок не загрузился. Объединила в один - что в исходной таблице и что нужно в итоге получить.

К сообщению приложен файл. Размер - 70Kb
26 окт 16, 20:01    [19825590]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Почему-то нет редактирования. Тороплюсь и в итоге неполный вопрос.
Запрос, который не работает:
автор
SELECT S.D, S.DIFF, S.ZM
FROM
(SELECT
IO.D,
ID.DIFF,
IO.ZM
FROM
dbo.new_INTERPOL_DIFF ID

INNER JOIN dbo.new_INTERPOL_OST IO
ON
IO.ID_DIFF = ID.ID_DIFF
GROUP BY IO.D, ID.DIFF, IO.ZM, ID.KodSyst
HAVING ID.KodSyst = 236
) S
PIVOT (ZM FOR ID.DIFF
IN (ID.DIFF)
) AS test_pivot
26 окт 16, 20:03    [19825600]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
iljy
Member

Откуда:
Сообщений: 8711
laifik,

PIVOT (MAX(ZM) FOR DIFF IN ([-1], [0], [1]) )
26 окт 16, 20:10    [19825624]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Спасибо, попробую. Только непонятно -
1) почему MAX? Мне же не максимальное число ZM нужно?
2) DIFF - указатель на таблицу S или ID должен стоять впереди S.DIFF?
3) А если диапазон DIFF у меня будет меняться. Он у меня определяется в таблице dbo.new_INTERPOL_DIFF, может быть от -9 до +9 - разные варианты, тогда как?
Во всех примерах, которые я видела в инете, фиксированные значения в таблицах. Примеры, в общем-то, простые. Берутся ФИО, год и сумма. Это не показательно. Нигде не используется схема усложненных запросов. Жаль...
26 окт 16, 22:15    [19825930]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
iljy
Member

Откуда:
Сообщений: 8711
laifik
Спасибо, попробую. Только непонятно -
1) почему MAX? Мне же не максимальное число ZM нужно?

Потому что PIVOT - это группировка (по сути, это просто синтаксический сахар). Поля, не входящие в группировку, обязательно должны быть под агрегатом (сервер должен понимать, какое значение ZM выбрать, если для какой-то пары ID,DIFF их будет несколько. Если пара уникальна, то никаких проблем агрегат не создаст.)

laifik
2) DIFF - указатель на таблицу S или ID должен стоять впереди S.DIFF?


Ну хотите - поставьте. У вас на вернем уровне запроса видна только одна таблица S, использование псевдонима не обязательно.

laifik
3) А если диапазон DIFF у меня будет меняться. Он у меня определяется в таблице dbo.new_INTERPOL_DIFF, может быть от -9 до +9 - разные варианты, тогда как?
Во всех примерах, которые я видела в инете, фиксированные значения в таблицах. Примеры, в общем-то, простые. Берутся ФИО, год и сумма. Это не показательно. Нигде не используется схема усложненных запросов. Жаль...


Структура результата должна быть фиксирована, поэтому и фиксированные значения. Нужна динамика - генерите динамический запрос и выполняйте через EXEC.
26 окт 16, 22:42    [19826005]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Спасибо большое за понятные объяснения. У меня все ролучилось. Огорчает то, что DIFF - фиксированны значения. Но в программе на Builder это можно с легкостью обыграть.
27 окт 16, 10:42    [19826964]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Спасибо большое за понятные объяснения. У меня все ролучилось. Огорчает то, что DIFF - фиксированны значения. Но в программе на Builder это можно с легкостью обыграть.
27 окт 16, 10:46    [19826985]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
laifik
Спасибо большое за понятные объяснения. У меня все ролучилось. Огорчает то, что DIFF - фиксированны значения. Но в программе на Builder это можно с легкостью обыграть.

динамический запрос
27 окт 16, 10:57    [19827038]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
iiyama
Member

Откуда:
Сообщений: 642
laifik,

А не проще развернуть таблицу на клиенте (читай на Builder) ? Зачем огород городите?
Тем более Buider (читай VCL )позволяет это сделать кликами мышкой
27 окт 16, 12:22    [19827664]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Мне удобно работать с заиросом. В общем-то, в Билдере все получилось быстро. А с Вашим предложением еще разбираться нужно. Спасибо, на будущее обязательно учту. Интересно.
27 окт 16, 14:39    [19828650]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
laifik
Member

Откуда:
Сообщений: 190
Мне удобно работать с заиросом. В общем-то, в Билдере все получилось быстро. А с Вашим предложением еще разбираться нужно. Спасибо, на будущее обязательно учту. Интересно.
27 окт 16, 16:44    [19829606]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT в запросе  [new]
_human
Member

Откуда:
Сообщений: 569
фигасе форум плющит - дублирует сообщения с задержкой в два часа
27 окт 16, 16:47    [19829639]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить