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

Отсоветуйте что-нибудь


DenK_vrtz   (2003-08-13 10:28:00) [21]

Rel_, кстати, у SergSuper классно работало бы, если code был равено ТОЛЬКО 0 или 1

SergSuper, первую сумму на -1 надо умножить, а то отрицательная сумма при code=0 получается. Так?


Johnmen   (2003-08-13 10:24:00) [22]

SELECT
Month M,
(SELECT SUM(T2.Value) FROM Table T2
WHERE (T2.Month=T1.Month) AND (T2.Code=0)) S1,
(SELECT SUM(T3.Value) FROM Table T3
WHERE (T3.Month=T1.Month) AND (T3.Code=1)) S2
FROM Table T1
GROUP BY T1.Month


DenK_vrtz   (2003-08-13 10:23:00) [23]

Rel_, так напиши функцию и в ней обработчик


Rel_   (2003-08-13 10:19:00) [24]

to DenK_vrtz ©
//
select Month, sum(SumCode0) SumCode0, sum(SumCode1) SumCode1
from
(select Month, decode(code,0,sumValue,0) SumCode0, decode (code,1,sumValue,0) SumCode1
from
( select Month, Code, sum(Value) sumValue
from anyTable
group by Month, Code
)
)
group by Month
// - ЭТО ТО, ЧТО НАДО, вот только у тебя делется всё только по 2-м значениям : code=0 и code=1, а мне нужно к примеру (code=0 и code<>0 (всё остальное))

to SergSuper

наверное так не получится - ты же просто пермножаешь величину на код и находишь сумму, а мне нужно вывести 2 столбца сумм, разделив их по признаку (коду)


Rel_   (2003-08-13 10:14:00) [25]

to DenK_vrtz © .

Из второго конечно можно, как энто можно сделать с помощью
decode???!!! Я бы его поковырял. Нужно нечто вроде

select ....

Sum(decode(code,<> некое значение, Value,0)),
Sum(decode(code,= некое значение, Value,0))
... и т.д.

и тогда всё будет впорядке (наверное).

Хотя со 2-м запросом ты прав конечно - всё отработает без проблем - просто хочется сделать побыстрее и покороче


SergSuper   (2003-08-13 10:11:00) [26]

а почему нельзя просто написать?
select Month, Sum(Value*(Code-1)) as SumCode0, Sum(Value*Code) as SumCode1
from anyTable
group by Month


DenK_vrtz   (2003-08-13 10:10:00) [27]

или вот
select Month, sum(SumCode0) SumCode0, sum(SumCode1) SumCode1
from
(select Month, decode(code,0,sumValue,0) SumCode0, decode (code,1,sumValue,0) SumCode1
from
( select Month, Code, sum(Value) sumValue
from anyTable
group by Month, Code
)
)
group by Month


DenK_vrtz   (2003-08-13 09:58:00) [28]

>>разделить весь набор данных не на code=0 и code=1 , а на >>code=10 (например) и code <> 10. Т.е. в первый столбец все >>записи с кодом 10, а другой все остальные

исходя из второго запроса DenK_vrtz © (13.08.03 09:55) можно. как? сам понимаешь :-)


DenK_vrtz   (2003-08-13 09:55:00) [29]

Rel_ (13.08.03 09:49), мой запрос маленько не корректен, так как получится

Month SumCode0 SumCode1
1 8 0
1 0 7

вот еще вариант (прототип твоего Both Join :-))

select mon.Month, t1.SumCode0, t2.SumCode1 from

(
SELECT Month,
SUM (Value) as SumCode0
FROM anyTable
WHERE Code=0
GROUP BY Month
) t1,

(
SELECT Month,
SUM (Value) as SumCode1
FROM anyTable
WHERE Code=1
GROUP BY Month
) t2,

(
SELECT Month
FROM anyTable
GROUP BY Month
) mon

where mon.Month=t1.Month(+)
and mon.Month=t2.Month(+)

ORDER BY mon.Month


Rel_   (2003-08-13 09:49:00) [30]

>>DenK_vrtz ©

Почему не работает??? А можно ли это хозяйство преобразовать так:

разделить весь набор данных не на code=0 и code=1 , а на code=10 (например) и code <> 10. Т.е. в первый столбец все записи с кодом 10, а другой все остальные.


Rel_   (2003-08-13 09:45:00) [31]

>>>to DenK_vrtz

Во круто. ща специально навояю табличку и попробую!!! Ну спасибо!!!


DenK_vrtz   (2003-08-13 09:45:00) [32]

Rel_ (13.08.03 09:43), а запрос DenK_vrtz © (13.08.03 09:39) не работает?


Rel_   (2003-08-13 09:43:00) [33]

Всё съехало (наверное ничего не понятно). Проще, что-то по аналогии с моим 2-м запросом но с использовнаием полного объединения таблиц (всё, что совпадает в обоих таблицах + всё, что не совпадает в первой таблице + всё, что не совпадает во второй таблице). Есть ли на Oracle аналог типа Both Join.


DenK_vrtz   (2003-08-13 09:39:00) [34]

select Month, decode(code,0,sumValue,0) SumCode0, decode(code,1,sumValue,0) SumCode1
from
( select Month, Code, sum(Value) sumValue
from anyTable
group by Month, Code
)


Rel_   (2003-08-13 09:39:00) [35]

использую ORACLE

Я ещё попробовал так

select t1.Month, t1.SumCode0, t2.SumCode1 from

(
SELECT Month,
SUM (Value) as SumCode0
FROM anyTable
WHERE Code=0
GROUP BY Month
) t1,

(
SELECT Month,
SUM (Value) as SumCode1
FROM anyTable
WHERE Code=1
GROUP BY Month
) t2

where t1.Month=t2.Month(+)

ORDER BY Month

но здесь тоже кроется ошибка , т.к. используется только LeftJoin,
а мне необходимо полное объединение, т.е.

t1 + t2 = T
Month Value Month Value Month t1.Value t2.Value
1 нечто 3 1 . .
2 . 4 2
5 . 3
6 и.т.д. и.т.д. 4
5
6 и т.д.


HSolo   (2003-08-13 09:22:00) [36]

Так и будет. Как быть - зависит от СУБД


DenK_vrtz   (2003-08-13 09:21:00) [37]

СУБД какая?


Страницы:   1 2

Наверх

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