![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос SQL [D6]
Rel_ © (2003-08-13 09:16:00)
Мастера, помогите с запросом.
есть след набор данных :
Month Code Value
1 0 2
1 0 6
1 1 7
2 0 8
3 1 1
3 1 10
3 0 3
Запрос должен выводить суммы (Value) с группировкой по месяцам, деля их по коду (Code). С кодом (0) - сумма в один столбец, с кодом (1) - сумма в другой столбец.
Результат запроса такой:
Month SumCode0 SumCode1
1 2+6=8 7
2 8 0
3 3 1+10=11
Мой запрос выглядел след. образом.
select Month, Sum(Value) as SumCode0, 0 as SumCode1
from anyTable
where Code =0
group by Month
union
select Month, 0 as SumCode0, Sum(Value) as SumCode1
from anyTable
where Code =1
group by Month
Проверить его возможности нет,
но по-моему энто неправильно, и результат получится след:
Month SumCode0 SumCode1
1 2+6=8 0
2 8 0
3 3 0
1 0 7
3 0 0
4 0 1+10=11
Отсоветуйте что-нибудь
Rel_ (2003-08-13 13:30:00) [1]
Работает мгновенно. Мастера, для меня вопрос определился. ОГРОМНОЕ СПАСИБО!!! Могу реализовать любые эксперементы с обсужаемыми запросами - они все у меня на экране.
Rel_ (2003-08-13 13:28:00) [2]
to DenK_vrtz © а где здесь одноимённые поля.
Кстати, попробовал запрос SergSuper - просто круто. Смотрите, во что превратился мой монстр:
SELECT mes_opl,
SUM (CASE
WHEN n_bol <> "999999"
THEN oplata+KWPL+REMON+ELEK-DOMOF
ELSE 0
END) AS sumcode0,
SUM (CASE
WHEN n_bol = "999999"
THEN oplata+KWPL+REMON+ELEK-DOMOF
ELSE 0
END) AS sumcode1
FROM opl22
WHERE n_bol <> "555555" AND n_bol <> "666666" AND mes_opl <= 7
GROUP BY mes_opl
union -- ну здесь то же самое
DenK_vrtz (2003-08-13 13:27:00) [3]
Сор, я не прав! Может объединять, только нехорошо это!
DenK_vrtz (2003-08-13 13:23:00) [4]
блин, а как вообще этот запрос може работать?! union all не пожет объединять запросы с разноименными полями
Johnmen (2003-08-13 13:22:00) [5]
>Rel_ (13.08.03 13:11) [31]
Если с дистинктом работает, то это особенности ораклового диалекта SQL. Идеологически это верно.
Если не работает с группировкой - это опять же особенности... Но это тоже верно.
А вообще, некоторый интерес представляет сравнение производительности разных предложенных здесь вариантов.
DenK_vrtz (2003-08-13 13:20:00) [6]
да, без 0,5 не разберешься!!!
На втором select после union all имеешь декартово произведение - это полохо!
Rel_ (2003-08-13 13:11:00) [7]
Народ, извините, что долго отсутствовал - уходил на обед. Итак, если беседа всё ещё актуальная и интересна С УДОВОЛЬСТВИЕМ продолжаю.
SergSuper Спасибо, щас обязательно попробую.
Johnmen © я приведу уже исправленный запрос (т.е. где distinct)
SELECT distinct mes_opl,
(SELECT SUM (t2.oplata+t2.KWPL+t2.REMON+t2.ELEK-t2.DOMOF)
FROM opl22 t2
WHERE (t2.mes_opl = t1.mes_opl) AND (t2.n_bol <> "999999")
) s1,
(SELECT SUM (t3.oplata+t3.KWPL+t3.REMON+t3.ELEK)
FROM opl22 t3
WHERE (t3.mes_opl = t1.mes_opl) AND (t3.n_bol = "999999")
) s2
FROM opl22 t1
WHERE t1.n_bol <> "555555" and t1.n_bol <> "666666" and t1.mes_opl<=7
union all
SELECT 13, s1.s, s2.s
FROM (SELECT SUM ( oplata+ kwpl+ remon+ elek- domof) s
FROM opl22
WHERE (mes_opl > 7)
AND (n_bol <> "999999")
AND (n_bol <> "555555")
AND (n_bol <> "666666")) s1,
(SELECT SUM ( oplata+ kwpl+ remon+ elek) s
FROM opl22
WHERE (mes_opl > 7) AND (n_bol = "999999")) s2
SergSuper (2003-08-13 12:33:00) [8]
Я чё-то еще меньше понимаю. Неужели из-за такой элементарной задачки надо писать такие монстрообразные запросы?
В MS SQL есть такая конструкция CASE, наверняка она есть и в ORACLE (это ж вроде стандартная конструкция). Тогда можно писать так
select Month,
Sum(case Code when 0 then Value else 0 end) as SumCode0,
Sum(case Code when 1 then Value else 0 end) as SumCode1
from anyTable
group by Month
Но есть Code может быть только 0 или 1 то можно использовать мой предыдущий вариант, только вместо Code-1 надо конечно писать 1-Code, ну пардон, ошибся.
Rel_, прежде чем отвергать - может стоит попробывать(то, что думать не хочется - я уже понял)?
DenK_vrtz (2003-08-13 12:28:00) [9]
Rel_ (13.08.03 12:05), я не понял! У всех запросов время выполнения одно и тоже?
Johnmen (2003-08-13 12:22:00) [10]
>Rel_ (13.08.03 11:54) [25]
>тогда при испоьлзовании group bu компилятор ругается на SUM
Можно глянуть на РЕАЛЬНЫЙ запрос ? И на сообщение об ошибке ?
Rel_ (2003-08-13 12:05:00) [11]
Конечно, 1 секунда, но запрос запускаю уже раз 10-ый, поэтому и проходит быстро (особенность ORACLE) - поэтому время точно не услежу. При первом запуске отрабатывал по-моему секунд 5-6.
DenK_vrtz (2003-08-13 11:57:00) [12]
Rel_, результаты по скорости можно узнать? Интересно!
Rel_ (2003-08-13 11:54:00) [13]
to Johnmen ©
А в чём в данном случае разница и почему тогда при испоьлзовании group bu компилятор ругается на SUM (по моему пытаясь сопоставить его с GROUP BY), хотя в вашем примере всё логично (не спорю).
DenK_vrtz (2003-08-13 11:51:00) [14]
а если так попробовать
select Month, sum(SumCode0) SumCode0, sum(SumCode1) SumCode1
from
(select Month, decode(code,:параметр,sumValue,0) SumCode0, decode (code,:параметр,sumValue,0) SumCode1
from
( select Month, Code, sum(Value) sumValue
from anyTable
group by Month, Code
)
)
group by Month
И хотелось бы сравнить результаты по скорости
Johnmen (2003-08-13 11:40:00) [15]
>Rel_ (13.08.03 11:29) [22]
>только там ошибочка - GROUP BY T1.Month
Нет, не ошибочка :) А distinct - ошибочка...
Rel_ (2003-08-13 11:29:00) [16]
to DenK_vrtz © не совсем . запрос должен работать в общем случае, например с параметрами code1=1276 и code<>1276
Запрос Johnmen © работает на ура, только там ошибочка - GROUP BY T1.Month следует убрать и добавить distinct
DenK_vrtz (2003-08-13 11:17:00) [17]
если надо разделить только cod=0 и cod<>0
select Month, sum(SumCode0) SumCode0, sum(SumCode1) SumCode1
from
(select Month, decode(code*1,0,sumValue,0) SumCode0, decode (code*1,cod,sumValue,0) SumCode1
from
( select Month, Code, sum(Value) sumValue
from anyTable
group by Month, Code
)
)
group by Month
Rel_ (2003-08-13 10:51:00) [18]
to Johnmen ©
вот спасибо - гениально и просто. Вот только ругается на SUM - не пойму почему. "выражение не является выражением group by" !!!
DenK_vrtz (2003-08-13 10:49:00) [19]
Rel_ (13.08.03 10:41), только union надо на union all заменить - быстрее работать будет.
Обрати внимание на запрос Johnmen © (13.08.03 10:24)!
Rel_ (2003-08-13 10:41:00) [20]
to DenK_vrtz © вооще ты прав - не разобрал.
Вот что я сделал:
SELECT month,
DECODE (code, 0, sumvalue, 0) sumcode0,
DECODE (code, 1, sumvalue, 0) sumcode1
FROM
(
SELECT month,
0 AS code,
SUM (value) as sumvalue
FROM anyTable
WHERE
code =0
GROUP BY month
UNION
SELECT month,
1 AS code,
SUM (value) as sumvalue
FROM anyTable
WHERE code <> 0
GROUP BY month
)