powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Одну выборку преобразовать в другую
22 сообщений из 22, страница 1 из 1
Одну выборку преобразовать в другую
    #39393806
Здравствуйте уважаемые коллеги!
Требуется сделать отчет на основе выборки, помогите пожалуйста, своего ума не хватает...
Исходные данные в SQL скрипте "для запроса.sql",
они имеют вид:
Код: sql
1.
2.
3.
4.
5.
6.
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


Результат как надо - картинка выборки ниже. Заранее благодарю.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39393808
Вот такой результат хочется получить.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39393809
белые клетки это просто не вписала в эту таблицу, а вот по гусям например все точно )))
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39393906
Mike_za
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь показаться не оригинальным, но это задаче клиентского репортера.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39393947
Mike_za, в нем и делаю.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39393999
Ребят, вот такой запрос получился, структура такая какая нужна! Только:
1. Тут код ну... очень не красивый!!! 4 раза обращаюсь к таблице.
2. И тут не верная выборка, т.е. Гуси только в Твери, а они в Москве появляются из за LEFT JOIN (не выбираются записи с null). В моем случае наверное надо инструкцию "LEFT JOIN AND RIGTH JOIN" )))))))... Надо как то по правильному фильтровать...
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39394049
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александра77,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
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

...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39394051
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александра77,

Но лучше в каком то средстве для создания репортов, они умеют делать такие сложные PIVOT
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39394086
alexeyvg,
Алексей, спасибо Вам огромное! Так точно и надо!
А вот про отчеты можно вопрос, например что использовать? Можно просто название - догуглю. Первый раз про них слышу, обычно QA-Copy-Excel-Paste да и всё. Можно всё в эксел сразу - да вот строк гораздо больше в выборке, чем Excel может принять.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39394376
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александра77А вот про отчеты можно вопрос, например что использовать?
Так вы же используете какой то? Вы же писали:Александра77Mike_za, в нем и делаю.
Разные есть.
Я почти не делаю отчётов, но вот немного использовал SSRS.
Раньше все пользовались Crystal Reports, знаменитая система.
Наверное, есть ещё куча хороших систем.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39395022
А, такие сложные нет, не использую, думала про Microsoft Query Analyzer.

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

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

"Недо-Оптимизация1"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
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"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
--- тут 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


...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39395207
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александра77Вот получилось так с PIVOT, а как вот с ним ещё бы добавить столбиков по сумме? Эта команда поддерживает только одно поле с агр.функцией? Если да, то жаль, команда волшебная, ещё бы ей функционала! )))

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

Однако можно это обойти остроумным применением UNPIVOT + PIVOT :-)
Хочу только заметить, что обрабатываемые таким образом столбцы должны иметь один тип.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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

...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39395899
alexeyvgОднако можно это обойти остроумным применением UNPIVOT + PIVOT :-)
Хочу только заметить, что обрабатываемые таким образом столбцы должны иметь один тип.

Алексей, спасибо вам огромное, по теме вопросов больше нет, благодаря вам!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Одну выборку преобразовать в другую
    #39638274
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgАлександра77Вот получилось так с PIVOT, а как вот с ним ещё бы добавить столбиков по сумме? Эта команда поддерживает только одно поле с агр.функцией? Если да, то жаль, команда волшебная, ещё бы ей функционала! )))

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

Однако можно это обойти остроумным применением UNPIVOT + PIVOT :-)
Хочу только заметить, что обрабатываемые таким образом столбцы должны иметь один тип.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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
Вот тестовая таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39638275
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что должно получиться(поле 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
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39638277
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучкачто должно получиться(поле 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_2id_1id_2
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39638364
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучкаsity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 nr_1 nr_2id_1id_2... зачем такие сложности ?
Так, не вариант ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
;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_21Москва2018-04-21 00:00:00.0002018-04-28 00:00:00.0006561010212Н.Н2018-04-21 00:00:00.0002018-04-28 00:00:00.00045451515213Уфа2018-04-21 00:00:00.0002018-04-28 00:00:00.000455441010214ЕКБ2018-04-21 00:00:00.0002018-04-28 00:00:00.0002233100100217Тверь2018-04-21 00:00:00.0002018-04-28 00:00:00.0006455545010021
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39638388
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtПрогер_самоучкаsity sityname date_opros_1 date_opros_2 kolvo_1_1 kolvo_1_2 kolvo_2_1 kolvo_2_2 nr_1 nr_2id_1id_2... зачем такие сложности ?
Так, не вариант ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
;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_21Москва2018-04-21 00:00:00.0002018-04-28 00:00:00.0006561010212Н.Н2018-04-21 00:00:00.0002018-04-28 00:00:00.00045451515213Уфа2018-04-21 00:00:00.0002018-04-28 00:00:00.000455441010214ЕКБ2018-04-21 00:00:00.0002018-04-28 00:00:00.0002233100100217Тверь2018-04-21 00:00:00.0002018-04-28 00:00:00.0006455545010021 rn я как аз таким образом и промаркировал)
Да, до такого просто и красивого решения я не додумался.
Снимаю шляпу. Большое спасибо.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39639055
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, честно говоря, не въезжаю почему условие
Код: sql
1.
and t2.rn=2


вызывает ошибку(использую MS Maestro 17.6.0.1 ОшибкаПоставщик данных или другая служба вернули состояние E_FAIL
Empty set (0.22 sec)
Если указать
Код: sql
1.
and t2.rn=1

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

Код: sql
1.
2.
3.
4.
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)
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39639115
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучка,
Такое возможно, если тип битовый.
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39639143
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучка,

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

Типа этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
;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 
...
Рейтинг: 0 / 0
Одну выборку преобразовать в другую
    #39639218
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtПрогер_самоучка,

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

Типа этого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
;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 делать
Большое спасибо.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Одну выборку преобразовать в другую
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]