![]() |
| ||
|
|
Новости |
Поиск |
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
Отсоветуйте что-нибудь
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]
СУБД какая?