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

Откуда:
Сообщений: 12
Здравствуйте уважаемые коллеги!
Требуется сделать отчет на основе выборки, помогите пожалуйста, своего ума не хватает...
Исходные данные в SQL скрипте "для запроса.sql",
они имеют вид:
DECLARE @temptable TABLE (sity nvarchar(15), typebird nvarchar(15), bird nvarchar(15), bird_viv nvarchar(15), bird_sost nvarchar(15), kolvo int, price decimal(14,1), trud int)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок1', 'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок2', '2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок1', 'Взрослая', 10, 200, 50)
...
SELECT * FROM @temptable

Результат как надо - картинка выборки ниже. Заранее благодарю.

К сообщению приложен файл (для запроса.sql - 5Kb) cкачать
28 янв 17, 18:38    [20157159]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
Вот такой результат хочется получить.

К сообщению приложен файл. Размер - 26Kb
28 янв 17, 18:40    [20157165]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
белые клетки это просто не вписала в эту таблицу, а вот по гусям например все точно )))
28 янв 17, 18:44    [20157170]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Боюсь показаться не оригинальным, но это задаче клиентского репортера.
28 янв 17, 23:59    [20157710]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
Mike_za, в нем и делаю.
29 янв 17, 09:54    [20158164]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
Ребят, вот такой запрос получился, структура такая какая нужна! Только:
1. Тут код ну... очень не красивый!!! 4 раза обращаюсь к таблице.
2. И тут не верная выборка, т.е. Гуси только в Твери, а они в Москве появляются из за LEFT JOIN (не выбираются записи с null). В моем случае наверное надо инструкцию "LEFT JOIN AND RIGTH JOIN" )))))))... Надо как то по правильному фильтровать...

К сообщению приложен файл (для запроса.sql - 7Kb) cкачать
29 янв 17, 13:58    [20158454]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30759
Александра77,

+
DECLARE @temptable TABLE (sity nvarchar(15), typebird nvarchar(15), bird nvarchar(15), bird_viv nvarchar(15), bird_sost nvarchar(15), kolvo int, price decimal(14,1), trud int)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок1', N'Птенцы', 450, 333, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'2мес', 37, 444, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок1', N'Взрослая', 70, 555, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'-', 820, 720, 100)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'-', 180, 1280, 100)

;with cte
as
(
select bird_viv, bird, bird_sost, sum(kolvo) as Количество, sum(price) as Корм, sum(trud) as Труд, sity + typebird as sitytypebird
from @temptable
group by bird, bird_viv, bird_sost, sity, typebird
)
select distinct c0.bird_viv, c0.bird, c0.bird_sost, c1.Количество, c1.Корм, c1.Труд, c2.Количество, c2.Корм, c2.Труд, c3.Количество, c3.Корм, c3.Труд, c4.Количество, c4.Корм, c4.Труд
from cte c0
left join (
	select bird_viv, bird, bird_sost, Количество, Корм, Труд
	from cte
	where sitytypebird = N'ТверьВодоплавающие'
	) c1 on c1.bird_viv = c0.bird_viv and c1.bird = c0.bird and c1.bird_sost = c0.bird_sost
left join (
	select bird_viv, bird, bird_sost, Количество, Корм, Труд
	from cte
	where sitytypebird = N'ТверьСухсодерж'
	) c2 on c2.bird_viv = c0.bird_viv and c2.bird = c0.bird and c2.bird_sost = c0.bird_sost
left join (
	select bird_viv, bird, bird_sost, Количество, Корм, Труд
	from cte
	where sitytypebird = N'МоскваВодоплавающие'
	) c3 on c3.bird_viv = c0.bird_viv and c3.bird = c0.bird and c3.bird_sost = c0.bird_sost
left join (
	select bird_viv, bird, bird_sost, Количество, Корм, Труд
	from cte
	where sitytypebird = N'МоскваСухсодерж'
	) c4 on c4.bird_viv = c0.bird_viv and c4.bird = c0.bird and c4.bird_sost = c0.bird_sost
29 янв 17, 16:12    [20158683]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30759
Александра77,

Но лучше в каком то средстве для создания репортов, они умеют делать такие сложные PIVOT
29 янв 17, 16:13    [20158687]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
alexeyvg,
Алексей, спасибо Вам огромное! Так точно и надо!
А вот про отчеты можно вопрос, например что использовать? Можно просто название - догуглю. Первый раз про них слышу, обычно QA-Copy-Excel-Paste да и всё. Можно всё в эксел сразу - да вот строк гораздо больше в выборке, чем Excel может принять.
29 янв 17, 17:36    [20158833]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30759
Александра77
А вот про отчеты можно вопрос, например что использовать?

Так вы же используете какой то? Вы же писали:
Александра77
Mike_za, в нем и делаю.

Разные есть.
Я почти не делаю отчётов, но вот немного использовал SSRS.
Раньше все пользовались Crystal Reports, знаменитая система.
Наверное, есть ещё куча хороших систем.
30 янв 17, 09:30    [20160063]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
А, такие сложные нет, не использую, думала про Microsoft Query Analyzer.

Вопрос по оптимизации, или про другую реализацию! Вот получилось так с PIVOT, а как вот с ним ещё бы добавить столбиков по сумме? Эта команда поддерживает только одно поле с агр.функцией? Если да, то жаль, команда волшебная, ещё бы ей функционала! )))

Т.е. сейчас тут только "Количество" 4 столбика, надо ещё 4 по "Корм" и 4 по "Труд".

+ "Недо-Оптимизация1"

DECLARE @temptable TABLE (sity nvarchar(15), typebird nvarchar(15), bird nvarchar(15), bird_viv nvarchar(15), bird_sost nvarchar(15), kolvo int, price decimal(14,1), trud int)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок1', 'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок2', '2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок1', 'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок2', '-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок1', 'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок2', '2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок1', 'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок2', '-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок1', 'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок2', '2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок1', 'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Сухсодерж', 'Куры', 'Выводок2', '-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок1', 'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок2', '2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок1', 'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Москва', 'Водоплавающие', 'Утки', 'Выводок2', '-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок1', 'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок2', '2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок1', 'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок2', '-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Утки', 'Выводок1', 'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Утки', 'Выводок2', '2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Утки', 'Выводок1', 'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Утки', 'Выводок2', '-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок1', 'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок2', '2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок1', 'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Сухсодерж', 'Куры', 'Выводок2', '-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Гуси', 'Выводок1', 'Птенцы', 450, 333, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Гуси', 'Выводок2', '2мес', 37, 444, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Гуси', 'Выводок1', 'Взрослая', 70, 555, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Гуси', 'Выводок2', '-', 820, 720, 100)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES ('Тверь', 'Водоплавающие', 'Гуси', 'Выводок2', '-', 180, 1281, 100)


SELECT bird_viv, bird, bird_sost, [МоскваСухсодерж], [МоскваВодоплавающие], [ТверьСухсодерж], [ТверьВодоплавающие]
FROM 
(
	select bird_viv, bird, bird_sost, sum(kolvo) as Количество, sum(price) as Корм, sum(trud) as Труд, sity + typebird as sitytypebird
	from @temptable
	group by bird, bird_viv, bird_sost, sity, typebird
) t
PIVOT (
	SUM(Количество) for sitytypebird in ([МоскваСухсодерж], [МоскваВодоплавающие], [ТверьСухсодерж], [ТверьВодоплавающие])
) AS pt



Вот такая "попытка" добавить столбики, но это не то совсем чувствую, да и строки повторяются. Надо командой PIVOT по "правильному" разложить!

+ "Недо-Анти-Оптимизация2"

--- тут DECLARE @temptable....

;with cte
as
(	select bird_viv, bird, bird_sost, sum(kolvo) as Количество, sum(price) as Корм, sum(trud) as Труд, sity + typebird as sitytypebird
	from @temptable
	group by bird, bird_viv, bird_sost, sity, typebird
)

SELECT 
a.bird_viv,
a.bird, 
a.bird_sost,
[МоскваСухсодержКолво],
[МоскваВодоплавающиеКолво],
[ТверьСухсодержКолво],
[ТверьВодоплавающиеКолво],
[МоскваСухсодержКорм],
[МоскваВодоплавающиеКорм],
[ТверьСухсодержКорм],
[ТверьВодоплавающиеКорм]
FROM
(
	SELECT bird_viv, bird, bird_sost, 
	[МоскваСухсодерж] AS МоскваСухсодержКолво, [МоскваВодоплавающие] AS МоскваВодоплавающиеКолво, 
	[ТверьСухсодерж] AS ТверьСухсодержКолво, [ТверьВодоплавающие] AS ТверьВодоплавающиеКолво
	FROM cte t
	PIVOT (
		SUM(Количество) for sitytypebird in ([МоскваСухсодерж], [МоскваВодоплавающие], [ТверьСухсодерж], [ТверьВодоплавающие])
	) AS pt
) a,
(
	SELECT bird_viv, bird, bird_sost, 
	[МоскваСухсодерж] AS МоскваСухсодержКорм, [МоскваВодоплавающие] AS МоскваВодоплавающиеКорм, 
	[ТверьСухсодерж] AS ТверьСухсодержКорм, [ТверьВодоплавающие] AS ТверьВодоплавающиеКорм
	FROM cte t
	PIVOT (
		SUM(Корм) for sitytypebird in ([МоскваСухсодерж], [МоскваВодоплавающие], [ТверьСухсодерж], [ТверьВодоплавающие])
	) AS pt
) b
WHERE a.bird_viv=b.bird_viv AND a.bird=b.bird AND a.bird_sost=b.bird_sost

30 янв 17, 21:42    [20163840]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30759
Александра77
Вот получилось так с PIVOT, а как вот с ним ещё бы добавить столбиков по сумме? Эта команда поддерживает только одно поле с агр.функцией? Если да, то жаль, команда волшебная, ещё бы ей функционала! )))

Т.е. сейчас тут только "Количество" 4 столбика, надо ещё 4 по "Корм" и 4 по "Труд".
К сожалению, PIVOT не умеет работать с несколькими агрегирующими функциями, т.е. с несколькими столбцами, поэтому я сразу и писал джойны.
PIVOT - это по сути другая форма джойна самого с собой, но упрощённая, и, соответственно, не применимая для общего случая "разворачивания" таблицы.

Однако можно это обойти остроумным применением UNPIVOT + PIVOT :-)
Хочу только заметить, что обрабатываемые таким образом столбцы должны иметь один тип.
+
DECLARE @temptable TABLE (sity nvarchar(15), typebird nvarchar(15), bird nvarchar(15), bird_viv nvarchar(15), bird_sost nvarchar(15), kolvo int, price int, trud int)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок1', N'Птенцы', 450, 333, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'2мес', 37, 444, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок1', N'Взрослая', 70, 555, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'-', 820, 720, 100)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'-', 180, 1280, 100)

;with cte
as
(
	select bird_viv, bird, bird_sost, sitytypebird + Part as sitytypebirdPart, Summa
	from(
	select bird_viv, bird, bird_sost, 
		sity + typebird as sitytypebird,
		sum(kolvo) as Количество, sum(price) as Корм, sum(trud) as Труд
	from @temptable
	group by bird, bird_viv, bird_sost, sity, typebird
	) as p
	UNPIVOT(
		Summa FOR Part in (Количество, Корм, Труд)
	) as u
)
select bird_viv, bird, bird_sost, 
	ТверьВодоплавающиеКоличество,ТверьВодоплавающиеКорм,ТверьВодоплавающиеТруд,ТверьСухсодержКоличество,ТверьСухсодержКорм,ТверьСухсодержТруд,
	МоскваВодоплавающиеКоличество,МоскваВодоплавающиеКорм,МоскваВодоплавающиеТруд,МоскваСухсодержКоличество,МоскваСухсодержКорм,МоскваСухсодержТруд
from (
	select bird_viv, bird, bird_sost, sitytypebirdPart, Summa
	from cte
) t
PIVOT(
	SUM(Summa) FOR sitytypebirdPart IN(ТверьВодоплавающиеКоличество,ТверьВодоплавающиеКорм,ТверьВодоплавающиеТруд,ТверьСухсодержКоличество,ТверьСухсодержКорм,ТверьСухсодержТруд,
		МоскваВодоплавающиеКоличество,МоскваВодоплавающиеКорм,МоскваВодоплавающиеТруд,МоскваСухсодержКоличество,МоскваСухсодержКорм,МоскваСухсодержТруд)
) p
order by bird_viv, bird, bird_sost
31 янв 17, 10:42    [20164920]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Александра77
Member

Откуда:
Сообщений: 12
alexeyvg
Однако можно это обойти остроумным применением UNPIVOT + PIVOT :-)
Хочу только заметить, что обрабатываемые таким образом столбцы должны иметь один тип.

Алексей, спасибо вам огромное, по теме вопросов больше нет, благодаря вам!
31 янв 17, 22:46    [20167959]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Одну выборку преобразовать в другую  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69387
alexeyvg
Александра77
Вот получилось так с PIVOT, а как вот с ним ещё бы добавить столбиков по сумме? Эта команда поддерживает только одно поле с агр.функцией? Если да, то жаль, команда волшебная, ещё бы ей функционала! )))

Т.е. сейчас тут только "Количество" 4 столбика, надо ещё 4 по "Корм" и 4 по "Труд".
К сожалению, PIVOT не умеет работать с несколькими агрегирующими функциями, т.е. с несколькими столбцами, поэтому я сразу и писал джойны.
PIVOT - это по сути другая форма джойна самого с собой, но упрощённая, и, соответственно, не применимая для общего случая "разворачивания" таблицы.

Однако можно это обойти остроумным применением UNPIVOT + PIVOT :-)
Хочу только заметить, что обрабатываемые таким образом столбцы должны иметь один тип.
+
DECLARE @temptable TABLE (sity nvarchar(15), typebird nvarchar(15), bird nvarchar(15), bird_viv nvarchar(15), bird_sost nvarchar(15), kolvo int, price int, trud int)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1000, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 210, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Москва', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1200, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Утки', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Птенцы', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'2мес', 15, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок1', N'Взрослая', 10, 300, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Сухсодерж', N'Куры', N'Выводок2', N'-', 100, 1500, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок1', N'Птенцы', 450, 333, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'2мес', 37, 444, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок1', N'Взрослая', 70, 555, 50)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'-', 820, 720, 100)
INSERT INTO @temptable (sity, typebird, bird, bird_viv, bird_sost, kolvo, price, trud) VALUES (N'Тверь', N'Водоплавающие', N'Гуси', N'Выводок2', N'-', 180, 1280, 100)

;with cte
as
(
	select bird_viv, bird, bird_sost, sitytypebird + Part as sitytypebirdPart, Summa
	from(
	select bird_viv, bird, bird_sost, 
		sity + typebird as sitytypebird,
		sum(kolvo) as Количество, sum(price) as Корм, sum(trud) as Труд
	from @temptable
	group by bird, bird_viv, bird_sost, sity, typebird
	) as p
	UNPIVOT(
		Summa FOR Part in (Количество, Корм, Труд)
	) as u
)
select bird_viv, bird, bird_sost, 
	ТверьВодоплавающиеКоличество,ТверьВодоплавающиеКорм,ТверьВодоплавающиеТруд,ТверьСухсодержКоличество,ТверьСухсодержКорм,ТверьСухсодержТруд,
	МоскваВодоплавающиеКоличество,МоскваВодоплавающиеКорм,МоскваВодоплавающиеТруд,МоскваСухсодержКоличество,МоскваСухсодержКорм,МоскваСухсодержТруд
from (
	select bird_viv, bird, bird_sost, sitytypebirdPart, Summa
	from cte
) t
PIVOT(
	SUM(Summa) FOR sitytypebirdPart IN(ТверьВодоплавающиеКоличество,ТверьВодоплавающиеКорм,ТверьВодоплавающиеТруд,ТверьСухсодержКоличество,ТверьСухсодержКорм,ТверьСухсодержТруд,
		МоскваВодоплавающиеКоличество,МоскваВодоплавающиеКорм,МоскваВодоплавающиеТруд,МоскваСухсодержКоличество,МоскваСухсодержКорм,МоскваСухсодержТруд)
) p
order by bird_viv, bird, bird_sost

Добрый день.
Пробовал делать по вашему шаблону, но что-то не клеится.
Если не очень сложно, то просьба помочь развернуть таблицу.
Не прокатило с датой, убрал её, но результата нужного не получил все равно, даже если выбирал все данные Int
Вот тестовая таблица
DECLARE @temptable TABLE (sity int, sityname nvarchar(15),date_opros datetime, kolvo_1 int, kolvo_2 int, nr int, id int)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (1,N'Москва', '20180428', 56, 10, 1, 500)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (2,N'Н.Н', '20180428', 45, 15, 1, 600)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (3,N'Уфа', '20180428',  44, 10, 1, 588)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (4,N'ЕКБ', '20180428',  33, 100, 1, 878)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (1,N'Москва', '20180421',  6, 10, 2, 100)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (2,N'Н.Н', '20180421',  45, 15, 2, 200)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (3,N'Уфа', '20180421',  455, 10, 2, 300)
INSERT INTO @temptable (sity, sityname, date_opros, kolvo_1, kolvo_2, nr, id) VALUES (4,N'ЕКБ', '20180421', 22, 100, 2, 400)
INSERT INTO @temptable (sity, sityname,  date_opros, kolvo_1, kolvo_2, nr, id) VALUES (7,N'Тверь', '20180428',  4555, 100, 1, 555)
INSERT INTO @temptable (sity, sityname,  date_opros, kolvo_1, kolvo_2, nr, id) VALUES (7,N'Тверь', '20180421',  6, 450, 2, 111)


Собственно, в идеале нужно развернуть все столбцы, кроме sity, sityname.
29 апр 18, 11:47    [21378569]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69387
что должно получиться(поле nr чисто для служебных целей(сортировка)
sity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 id_1 id_2
29 апр 18, 11:54    [21378575]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69387
Прогер_самоучка
что должно получиться(поле nr чисто для служебных целей(сортировка)
sity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 id_1 id_2
извиняюсь, поправлю чуть-чуть

sity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 nr_1 nr_2
id_1id_2
29 апр 18, 12:17    [21378598]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
court
Member

Откуда:
Сообщений: 1956
Прогер_самоучка
sity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 nr_1 nr_2
id_1id_2
... зачем такие сложности ?
Так, не вариант ?

;with cte as (
	select 
		*
		,rn	=ROW_NUMBER()over(partition by sity order by date_opros)  
	from @temptable)
	
select
	t1.sity 
	,t1.sityname 
	,date_opros_1	=t1.date_opros 
	,date_opros_2	=t2.date_opros 
	,kolvo_1_1		=t1.kolvo_1 
	,kolvo_1_2		=t2.kolvo_1  
	,kolvo_2_1		=t1.kolvo_2 
	,kolvo_2_2		=t2.kolvo_2  
	,nr_1			=t1.nr 
	,nr_2			=t2.nr 
	  
from cte t1 left join cte t2 on t1.sity=t2.sity and t2.rn=2 
where t1.rn=1


sitysitynamedate_opros_1date_opros_2kolvo_1_1kolvo_1_2kolvo_2_1kolvo_2_2nr_1nr_2
1Москва2018-04-21 00:00:00.0002018-04-28 00:00:00.000656101021
2Н.Н2018-04-21 00:00:00.0002018-04-28 00:00:00.0004545151521
3Уфа2018-04-21 00:00:00.0002018-04-28 00:00:00.00045544101021
4ЕКБ2018-04-21 00:00:00.0002018-04-28 00:00:00.000223310010021
7Тверь2018-04-21 00:00:00.0002018-04-28 00:00:00.0006455545010021
29 апр 18, 20:12    [21379084]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69387
court
Прогер_самоучка
sity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 nr_1 nr_2
id_1id_2
... зачем такие сложности ?
Так, не вариант ?

;with cte as (
	select 
		*
		,rn	=ROW_NUMBER()over(partition by sity order by date_opros)  
	from @temptable)
	
select
	t1.sity 
	,t1.sityname 
	,date_opros_1	=t1.date_opros 
	,date_opros_2	=t2.date_opros 
	,kolvo_1_1		=t1.kolvo_1 
	,kolvo_1_2		=t2.kolvo_1  
	,kolvo_2_1		=t1.kolvo_2 
	,kolvo_2_2		=t2.kolvo_2  
	,nr_1			=t1.nr 
	,nr_2			=t2.nr 
	  
from cte t1 left join cte t2 on t1.sity=t2.sity and t2.rn=2 
where t1.rn=1



sitysitynamedate_opros_1date_opros_2kolvo_1_1kolvo_1_2kolvo_2_1kolvo_2_2nr_1nr_2
1Москва2018-04-21 00:00:00.0002018-04-28 00:00:00.000656101021
2Н.Н2018-04-21 00:00:00.0002018-04-28 00:00:00.0004545151521
3Уфа2018-04-21 00:00:00.0002018-04-28 00:00:00.00045544101021
4ЕКБ2018-04-21 00:00:00.0002018-04-28 00:00:00.000223310010021
7Тверь2018-04-21 00:00:00.0002018-04-28 00:00:00.0006455545010021
rn я как аз таким образом и промаркировал)
Да, до такого просто и красивого решения я не додумался.
Снимаю шляпу. Большое спасибо.
29 апр 18, 21:46    [21379199]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69387
Я, честно говоря, не въезжаю почему условие
and t2.rn=2

вызывает ошибку(использую MS Maestro 17.6.0.1
Ошибка
Поставщик данных или другая служба вернули состояние E_FAIL
Empty set (0.22 sec)

Если указать
and t2.rn=1
то прокатывает, но это ошибочный результат. Хочется понять, почему обычное условие не возвращает результат, а вываливается с ошибкой..
З.Ы. Если использовать SSMS, то никаких ошибок не возникает и запрос отрабатывает на ура

Microsoft SQL Server 2008 R2 (SP2) - 10.50.4263.0 (X64) 
	Aug 23 2012 15:56:56 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)
2 май 18, 17:30    [21382910]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Massa52
Member

Откуда:
Сообщений: 373
Прогер_самоучка,
Такое возможно, если тип битовый.
2 май 18, 23:50    [21383181]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
court
Member

Откуда:
Сообщений: 1956
Прогер_самоучка,

по-поводу ошибки, - ничего не скажу,
но, навсякий, запрос можно переписать на эквивалентный без self join-а и условия по константе в join-е (но, правда, с групп баем)
Может такое это Маестро примет ...

Типа этого:
;with cte as (
	select 
		*
		,rn	=ROW_NUMBER()over(partition by sity order by date_opros)  
	from @temptable)
	
select
	sity 
	,sityname 
	,date_opros_1	=max(case when rn=1 then date_opros end) 
	,date_opros_2	=max(case when rn=2 then date_opros end) 
	,kolvo_1_1		=max(case when rn=1 then kolvo_1 end)
	,kolvo_1_2		=max(case when rn=2 then kolvo_1 end)  
	,kolvo_2_1		=max(case when rn=1 then kolvo_2 end) 
	,kolvo_2_2		=max(case when rn=2 then kolvo_2 end)  
	,nr_1			=max(case when rn=1 then nr end) 
	,nr_2			=max(case when rn=2 then nr end) 
	  
from cte
group by 
	sity 
	,sityname 
3 май 18, 07:04    [21383271]     Ответить | Цитировать Сообщить модератору
 Re: Одну выборку преобразовать в другую  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69387
court
Прогер_самоучка,

по-поводу ошибки, - ничего не скажу,
но, навсякий, запрос можно переписать на эквивалентный без self join-а и условия по константе в join-е (но, правда, с групп баем)
Может такое это Маестро примет ...

Типа этого:
;with cte as (
	select 
		*
		,rn	=ROW_NUMBER()over(partition by sity order by date_opros)  
	from @temptable)
	
select
	sity 
	,sityname 
	,date_opros_1	=max(case when rn=1 then date_opros end) 
	,date_opros_2	=max(case when rn=2 then date_opros end) 
	,kolvo_1_1		=max(case when rn=1 then kolvo_1 end)
	,kolvo_1_2		=max(case when rn=2 then kolvo_1 end)  
	,kolvo_2_1		=max(case when rn=1 then kolvo_2 end) 
	,kolvo_2_2		=max(case when rn=2 then kolvo_2 end)  
	,nr_1			=max(case when rn=1 then nr end) 
	,nr_2			=max(case when rn=2 then nr end) 
	  
from cte
group by 
	sity 
	,sityname 
Этот вариант - супер.
Ибо предыдущий выводил не все записи(из-за лефт джоина не было записей из правой таблицы, отсутствующие в левой) и пришлось union делать
Большое спасибо.
3 май 18, 10:21    [21383580]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить