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

Откуда: Slovensko
Сообщений: 8098
Привет!

Есть таблица справочника, в котором указана ссылка на документ (id в таблице документов), присвоенный статус документу и дата этого статуса.

Я делаю такую выборку, чтобы получить последнюю дату для каждого статуса:
select
	Сислог.Документ   Документ,
	Сислог.Событие    Событие,
	max(Сислог.Дата)  Дата
	
from
	Справочник_СисЛогДокументов Сислог

where
	left(Сислог.Документ, 4) = ' 30Q'
	and Сислог.Документ in (' 30Q F49F4007', ' 30Q HND4W   ') -- тест на конкретных документах
	

group by
	Сислог.Документ,
	Сислог.Событие

order by
	Сислог.Документ,
	max(Сислог.Дата)

И получаю такой результат:
Документ      Событие   Дата
------------- --------- -----------------------
30Q F49F4007 9EW 2015-09-14 00:00:00.000
30Q F49F4007 9EQ 2015-09-21 00:00:00.000
30Q F49F4007 9ET 2015-09-24 00:00:00.000
30Q F49F4007 9ER 2015-09-25 00:00:00.000
30Q HND4W 9EW 2015-08-27 00:00:00.000
30Q HND4W 9ER 2015-09-02 00:00:00.000
30Q HND4W 9HB 2015-09-23 00:00:00.000

Это линейная выборка, но я хочу эту выборку представить как таблицу, где по вертикали - id документа, по горизонтали несколько столбцов для каждого статуса и на пересечении их будет дата присвоения статуса. Что-то типа такого:
Документ           9EW        9EQ         9ET         9ER          9HB
------------- ---------- ---------- ---------- ---------- ----------
30Q F49F4007 2015-09-14 2015-09-21 2015-09-24 2015-09-25 null
30Q HND4W 2015-08-27 null null 2015-09-02 2015-09-23

Делаю левое соединение к таблице по условию каждого статуса, но так работает очень долго:
select
	Сислог0.Документ  ИдДокумента,
	max(Сислог1.Дата) Дата_УточнениеДанных,
	max(Сислог2.Дата) Дата_Отказ,
	max(Сислог3.Дата) Дата_ПринятоРешение

from
	Справочник_СислогДокументов Сислог0   (nolock)
	FULL OUTER JOIN Справочник_СислогДокументов Сислог1 (nolock) on Сислог1.Документ = Сислог0.Документ and Сислог1.Событие = '   9GY   ' -- УточнениеДанных
	FULL OUTER JOIN Справочник_СислогДокументов Сислог2 (nolock) on Сислог2.Документ = Сислог0.Документ and Сислог2.Событие = '   9EU   ' -- Отказ
	FULL OUTER JOIN Справочник_СислогДокументов Сислог3 (nolock) on Сислог3.Документ = Сислог0.Документ and Сислог3.Событие = '   9EW   ' -- ПринятоРешение

group by
	Сислог0.Документ

order by
	1


Подскажите, как лучше оптимизировать последний запрос?
Я думаю, что выбрать все данные по документам,

Сообщение было отредактировано: 9 ноя 15, 13:34
9 ноя 15, 11:16    [18387913]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
упс... отправил... 

Я думаю, что выбрать все данные по документам, поместить во временную таблицу и уже потом лепить из неё левые соединения для формирования такой таблицы.
Что скажете?
9 ноя 15, 11:18    [18387926]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Это линейная выборка, но я хочу эту выборку представить как таблицу, где по вертикали - id документа, по горизонтали несколько столбцов для каждого статуса и на пересечении их будет дата присвоения статуса. Что-то типа такого:
Документ           9EW        9EQ         9ET         9ER          9HB
------------- ---------- ---------- ---------- ---------- ----------
30Q F49F4007 2015-09-14 2015-09-21 2015-09-24 2015-09-25 null
30Q HND4W 2015-08-27 null null 2015-09-02 2015-09-23


PIVOT
9 ноя 15, 11:19    [18387932]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
PIVOT
ЯННП
9 ноя 15, 11:26    [18387977]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
PIVOT
Как применить это к моему запросу? Дай пример, опжалуйста.
9 ноя 15, 11:27    [18387985]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Glory
PIVOT
ЯННП

Хелп откройте и там наберите PIVOT в поиске
9 ноя 15, 11:28    [18387988]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
Владимир Лазурко
пропущено...
ЯННП

Хелп откройте и там наберите PIVOT в поиске
Вот по примеру хэлпа сделал такой запрос на основании своего:
select
	Документ,
	'   9EW   ',
	'   9EQ   ',
	'   9ET   ',
	'   9ER   ',
	'   9HB   '

from (

	select
		Сислог.Документ   Документ,
		Сислог.Событие    Событие,
		max(Сислог.Дата)  Дата
	
	from
		Справочник_СисЛогДокументов Сислог

	where
		left(Сислог.Документ, 4) = ' 30Q'
		and Сислог.Документ in (' 30Q F49F4007', ' 30Q HND4W   ') -- тест на конкретных документах
	

	group by
		Сислог.Документ,
		Сислог.Событие

	--order by
	--	Сислог.Документ,
	--	max(Сислог.Дата)

	) as ИсходнаяТаблица

pivot
	Документ -- вот здесь ошибка "Сообщение 102, уровень 15, состояние 1, строка 35 Incorrect syntax near 'Документ'."

for
	Событие
in
	('   9EW   ',
	'   9EQ   ',
	'   9ET   ',
	'   9ER   ',
	'   9HB   ')) as СводнаяТаблица
и скуль ругается на все слова после pivot. Я и псевдонимы ставил, и имена полей, и .. и не получаетсфя - все время ошибка " Сообщение 102, уровень 15, состояние 1, строка 35
Incorrect syntax near 'Документ'."
9 ноя 15, 13:46    [18389060]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
_djХомяГ
Guest
Пальцем в небо А версия сервера (уровень совместимости) позволяет использовать PIVOT?
9 ноя 15, 13:48    [18389077]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Вот по примеру хэлпа

И что там прямо в примере после PIVOT например скобок нет ? Или вы их сами решили отбросить ?
9 ноя 15, 13:49    [18389089]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Владимир Лазурко,

PIVOT <pivot_clause> [ AS ] table_alias

<pivot_clause> ::=
        ( aggregate_function ( value_column [ [ , ]...n ]) 
        FOR pivot_column 
        IN ( <column_list> ) 
    )


Где у вас агрегатная функция?? Почему после PIVOT стоит имя поля запроса???
9 ноя 15, 13:53    [18389124]     Ответить | Цитировать Сообщить модератору
 Re: Cjplfyhbt  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Переделал запрос:

select
	Документ,
	--Событие,
	['   9EW   '],
	['   9EQ   '],
	['   9ET   '],
	['   9ER   '],
	['   9HB   ']

from (

	select
		Сислог.Документ,
		Сислог.Событие,
		max(Сислог.Дата)  Дата
	
	from
		Справочник_СисЛогДокументов Сислог

	where
		left(Сислог.Документ, 4) = ' 30Q'
		and Сислог.Документ in (' 30Q F49F4007', ' 30Q HND4W   ') -- тест на конкретных документах
	

	group by
		Сислог.Документ,
		Сислог.Событие

	--order by
	--	Сислог.Документ,
	--	max(Сислог.Дата)

	) as ИсходнаяТаблица

pivot
	(max(Дата)

for
	Событие
in
	(['   9EW   '],
	['   9EQ   '],
	['   9ET   '],
	['   9ER   '],
	['   9HB   '])  )  as СводнаяТаблица

И получаю НУЛЛы везде:

Документ      '   9EW   '             '   9EQ   '             '   9ET   '             '   9ER   '             '   9HB   '
------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
30Q F49F4007 NULL NULL NULL NULL NULL
30Q HND4W NULL NULL NULL NULL NULL
9 ноя 15, 14:12    [18389325]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Владимир Лазурко,

хвостовые пробелы-то, небось отсекаются при сравнении!
9 ноя 15, 14:15    [18389355]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
И получаю НУЛЛы везде:

Значит у вас везде NULL-ы
9 ноя 15, 14:16    [18389368]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
iap
хвостовые пробелы-то, небось отсекаются при сравнении!
Это идентификаторы элементов справочника.
Glory
Значит у вас везде NULL-ы
Нет. В шапке топика данные "линейного запроса" показаны. Там даты.
9 ноя 15, 14:18    [18389380]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
iap
хвостовые пробелы-то, небось отсекаются при сравнении!
Точно!

Дополнил строку с идентификатором события кавычками и получил искомую таблицу:
'''' + Сислог.Событие + '''' as Событие,


Документ      '   9EW   '             '   9EQ   '             '   9ET   '             '   9ER   '             '   9HB   '
------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
30Q F49F4007 2015-09-14 00:00:00.000 2015-09-21 00:00:00.000 2015-09-24 00:00:00.000 2015-09-25 00:00:00.000 NULL
30Q HND4W 2015-08-27 00:00:00.000 NULL NULL 2015-09-02 00:00:00.000 2015-09-23 00:00:00.000
9 ноя 15, 14:20    [18389404]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Нет. В шапке топика данные "линейного запроса" показаны. Там даты.

Нравятся мне доказывальщики того, что их прекрасный код всегда портит Майкросфт
9 ноя 15, 14:22    [18389416]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Круто!
Вопрос решён. Спасибо Glory и iap
9 ноя 15, 14:22    [18389427]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
Нравятся мне доказывальщики того, что их прекрасный код всегда портит Майкросфт
Я где-то критиковал майкрософт?
9 ноя 15, 14:23    [18389432]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Может, кому пригодится (да и себе на память). Результирующий запрос под спойлером.
+
select
	Документ,
	--Событие,
	['   9EW   '],
	['   9EQ   '],
	['   9ET   '],
	['   9ER   '],
	['   9HB   ']

from (

	select
		Сислог.Документ,
		'''' + Сислог.Событие + '''' as Событие,
		max(Сислог.Дата)  Дата
	
	from
		Справочник_СисЛогДокументов Сислог

	where
		left(Сислог.Документ, 4) = ' 30Q'
		and Сислог.Документ in (' 30Q F49F4007', ' 30Q HND4W   ') -- тест на конкретных документах
	

	group by
		Сислог.Документ,
		Сислог.Событие

	--order by
	--	Сислог.Документ,
	--	max(Сислог.Дата)

	) as ИсходнаяТаблица

pivot
	(max(Дата)

for
	Событие
in
	(['   9EW   '],
	['   9EQ   '],
	['   9ET   '],
	['   9ER   '],
	['   9HB   '])  )  as СводнаяТаблица
9 ноя 15, 14:24    [18389452]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Glory
Нравятся мне доказывальщики того, что их прекрасный код всегда портит Майкросфт
Я где-то критиковал майкрософт?

Да. Вы уверяете, что "Там даты." а запрос их не выводит
9 ноя 15, 14:26    [18389469]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
Да. Вы уверяете, что "Там даты." а запрос их не выводит
Всё правильно. "Запрос" не выводит, а не "майкрософт эскюэль чего-то там".
9 ноя 15, 14:37    [18389559]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Всё правильно. "Запрос" не выводит, а не "майкрософт эскюэль чего-то там".

А запрос то такой кто написал ?
9 ноя 15, 14:38    [18389567]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
Да. Вы уверяете, что "Там даты." а запрос их не выводит
Потому что я вижу такой результат в исходном запросе:
Документ      Событие   Дата
------------- --------- -----------------------
30Q F49F4007 9EW 2015-09-14 00:00:00.000
30Q F49F4007 9EQ 2015-09-21 00:00:00.000
30Q F49F4007 9ET 2015-09-24 00:00:00.000
30Q F49F4007 9ER 2015-09-25 00:00:00.000
30Q HND4W 9EW 2015-08-27 00:00:00.000
30Q HND4W 9ER 2015-09-02 00:00:00.000
30Q HND4W 9HB 2015-09-23 00:00:00.000

А когда использовал PIVOT, то получил нуллы.
Документ      '   9EW   '             '   9EQ   '             '   9ET   '             '   9ER   '             '   9HB   '
------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
30Q F49F4007 NULL NULL NULL NULL NULL
30Q HND4W NULL NULL NULL NULL NULL

о чем и написал - ~мой~ запрос не выводит даты.

Короче, не было с кем поспорить. Испортил своими претензиями мнение о себе.
9 ноя 15, 14:40    [18389576]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Glory
Member

Откуда:
Сообщений: 104751
Владимир Лазурко
Испортил своими претензиями мнение о себе.

Ой все. Моя жизнь теперь пойдет прахом

Владимир Лазурко
Короче, не было с кем поспорить.

После публикации ваших якобы взятых из примера запросов вам бы следовало больше времени посветить изучению синтаксиса, а не спорам
9 ноя 15, 14:43    [18389597]     Ответить | Цитировать Сообщить модератору
 Re: Запрос  [new]
Владимир Лазурко
Member

Откуда: Slovensko
Сообщений: 8098
Glory
Ой все
9 ноя 15, 14:51    [18389640]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить