Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Marisolka Member Откуда: Сообщений: 8 |
Всем добрый день! Есть несколько однотипных таблиц. Например, Таблица1
Таблица2
Таблица3
Нужно создать таблицу, которая включает в себя все три показателя в среднем за месяц, т.е.
Какой SQL запрос лучше написать? |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
18 сен 19, 22:24 [21973694] Ответить | Цитировать Сообщить модератору |
vikkiv Member Откуда: EU Сообщений: 2931 |
лучше всего будет самый производительный и писать к тому-же нужно правильный. в общих чертах: сначала сделать словарь/изм. месяцев и к нему уже цеплять агрегации показателей фунцией AVG(так среднее называется по англ.) |
||
18 сен 19, 22:47 [21973705] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
|
||
18 сен 19, 23:33 [21973747] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 55341 |
select t.m, max(v1), max(v2), max(v3) from ( select t.m, avg(t.value) v1, null v2, null v3 from t1 t group by t.m union allselect t.m, null v1, avg(t.value) v2, null v3 from t2 t group by t.m union allselect t.m, null v1, null v2, avg(t.value) v3 from t3 t group by t.m ) t group by t.m |
||
19 сен 19, 07:15 [21973795] Ответить | Цитировать Сообщить модератору |
Max_Хацкер Member Откуда: Челябинск Сообщений: 154 |
Например так:;WITH Months AS ( --список месяцев SELECT [Номер месяца] FROM Таблица1 UNION SELECT [Номер месяца] FROM Таблица1 UNION SELECT [Номер месяца] FROM Таблица1) SELECT m.[Номер месяца] ,AVG(t1.[Показатель1]) AS [СреднийПоказатель1] ,AVG(t2.[Показатель1]) AS [СреднийПоказатель2] ,AVG(t3.[Показатель1]) AS [СреднийПоказатель3] FROM Months m LEFT OUTER JOIN [Таблица1] t1 ON t1.[Номер месяца] = m.[Номер месяца] LEFT OUTER JOIN [Таблица2] t2 ON t2.[Номер месяца] = m.[Номер месяца] LEFT OUTER JOIN [Таблица3] t3 ON t3.[Номер месяца] = m.[Номер месяца] GROUP BY m.[Номер месяца] Из-за LEFT JOIN-ов надо ещё придумать что с NULL делать, но мне лень. :) |
19 сен 19, 07:20 [21973800] Ответить | Цитировать Сообщить модератору |
Marisolka Member Откуда: Сообщений: 8 |
Написала такой запрос: SELECT AVG(t1.Показатель11) as cv1, t1.Номер_месяца, AVG(cv2), AVG(cv4) From Таблица1 t1 left join (Select t2.Номер_месяца, AVG(t2.Показатель2) as cv2, AVG(cv3) as cv4 from Таблица2 t2 left join (Select t3.Номер_месяца, AVG(t3.Показатель3) as cv3 from Таблица3 t3 Group by t3.Номер_месяца) t3 on t2.Номер_месяца=t3.Номер_месяца Group by t2.Номер_месяца) t4 on t4.Номер_месяца=t1.Номер_месяца Group by t1.Номер_месяца Просто думаю, может что-то легче есть..... |
19 сен 19, 17:58 [21974573] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 55341 |
|
||
19 сен 19, 18:44 [21974624] Ответить | Цитировать Сообщить модератору |
Marisolka Member Откуда: Сообщений: 8 |
andreymx, Спасибо! |
24 сен 19, 17:55 [21978310] Ответить | Цитировать Сообщить модератору |
Charles Weyland Member Откуда: Feorina "Fury" 161 Сообщений: 4359 |
Объединить все таблицы с помощью UNION ALL, а затем применить конструкцию PIVOT |
24 сен 19, 18:49 [21978364] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |