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

Откуда:
Сообщений: 80
Есть таблица Incom(ID,Dep,Day,Sum)
где Day в диапазоне от 1 до 5
Есть запрос:
SELECT DISTINCT Incom.Dep, 
(SELECT Avg(I.Sum) FROM Incom As I WHERE I.Day=1 AND I.Dep=Incom.Dep) AS 1, 
(SELECT Avg(I.Sum) FROM Incom As I WHERE I.Day=2 AND I.Dep=Incom.Dep) AS 2, 
(SELECT Avg(I.Sum) FROM Incom As I WHERE I.Day=3 AND I.Dep=Incom.Dep) AS 3, 
(SELECT Avg(I.Sum) FROM Incom As I WHERE I.Day=4 AND I.Dep=Incom.Dep) AS 4, 
(SELECT Avg(I.Sum) FROM Incom As I WHERE I.Day=5 AND I.Dep=Incom.Dep) AS 5
FROM Incom;
Можно ли его преобразовать так, чтобы избавиться от повторов одних и тех же селектов с разным Day, записав этот перебор какой-то короткой конструкцией?
22 янв 12, 14:14    [11947431]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
SELECT *
FROM Incom i
pivot ( avg (sum) for day in ( [1],[2],[3],[4],[5]) ) pv
22 янв 12, 14:18    [11947448]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
George Ru
Member

Откуда:
Сообщений: 80
Разве с использованием Pivot не так надо?
SELECT Dep, [1] as 1, [2] as 2, [3] as 3, [4] as 4, [5] as 5
FROM
(SELECT Dep, Day, Sum
FROM Incom) As SourceTable
PIVOT
(Avg(Sum) FOR Day IN ([1], [2], [3], [4], [5])) As PivotTable
И есть ли другой способ без использования Pivot?
22 янв 12, 14:34    [11947485]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
qwerty112
Guest
George Ru
[/src]И есть ли другой способ без использования Pivot?

avg(case when I.Day=1 then I.Sum else null end) as 1,
avg(case when I.Day=2 then I.Sum else null end) as 2,
...
22 янв 12, 14:45    [11947517]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
George Ru
Member

Откуда:
Сообщений: 80
qwerty112
avg(case when I.Day=1 then I.Sum else null end) as 1,
avg(case when I.Day=2 then I.Sum else null end) as 2,
...
Поподробнее можно? Как это будет выглядеть внутри SELECT?
И опять же будет перебор всех Day от 1 до 5, как сократить?

Без PIVOT сократить вообще больше никак нельзя?
22 янв 12, 15:52    [11947706]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
George Ru
qwerty112
avg(case when I.Day=1 then I.Sum else null end) as 1,
avg(case when I.Day=2 then I.Sum else null end) as 2,
...
Поподробнее можно? Как это будет выглядеть внутри SELECT?


SELECT Dep, 
avg(case when Day=1 then Sum else null end) as 1,
avg(case when Day=2 then Sum else null end) as 2,
avg(case when Day=3 then Sum else null end) as 3,
avg(case when Day=4 then Sum else null end) as 4,
avg(case when Day=5 then Sum else null end) as 5
FROM Incom
group by Dep



George Ru
И опять же будет перебор всех Day от 1 до 5, как сократить?

А смысл? Вам кол-во символов в коде смущает? Вариант выше делает ОДНО обращение к вашей таблице, а ваш первый вариант 6
22 янв 12, 16:20    [11947764]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
George Ru
Member

Откуда:
Сообщений: 80
Knyazev Alexey
А смысл? Вам кол-во символов в коде смущает? Вариант выше делает ОДНО обращение к вашей таблице, а ваш первый вариант 6

По кол-ву обращений конечно же второй вариант выигрывает, спасибо.
Но и кол-во символов хотелось бы сократить.
Т.к. этот пример дан только для 5 дней (рабочих в неделе).
А если нужно сделать за все дни в месяце или в году?
Придётся 365 строк кода делать?
22 янв 12, 16:28    [11947777]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
George Ru
Knyazev Alexey
А смысл? Вам кол-во символов в коде смущает? Вариант выше делает ОДНО обращение к вашей таблице, а ваш первый вариант 6

По кол-ву обращений конечно же второй вариант выигрывает, спасибо.
Но и кол-во символов хотелось бы сократить.
Т.к. этот пример дан только для 5 дней (рабочих в неделе).
А если нужно сделать за все дни в месяце или в году?
Придётся 365 строк кода делать?


тогда динамический СКЛ вам в помощь: Crosstab
22 янв 12, 16:54    [11947818]     Ответить | Цитировать Сообщить модератору
 Re: Как сократить текст запроса  [new]
George Ru
Member

Откуда:
Сообщений: 80
Knyazev Alexey
тогда динамический СКЛ вам в помощь: Crosstab
Спасибо, буду изучать.
22 янв 12, 17:02    [11947843]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить