Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

запрос SQL [D6]


Страницы:   1 2

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
)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо