SQL Count Question
4 отговора
224 прегледа
SQL Count Question
Въпросът ми е не само за Count, но и за другите агрегатни функции:
Имам таблица t1, чийто primary key е t1_pk.
select Suma, Count(Suma)
from t1
group by Suma
ми показва колко пъти в таблицата t1 я има сумата Suma, но това, което искам е и да ми покаже кои са ID-tata на тези редове - тоест всички полета t1_pk , които участват в сумата
ако напиша това:
select Suma, Count(Suma), t1_pk
from t1
group by Suma, t1_pk
тогава не сумира това, което искам ... тоест дори и да имам еднакви полета Suma, то няма да им направи Count, защото t1_pk им са различни ...
Това предполагам е General SQL въпрос и няма нужда да споменавам базата каква е (Oracle e :))
Дано сте ме разбрали, по-точно не мога да го обясня
Благодаря

Имам таблица t1, чийто primary key е t1_pk.
select Suma, Count(Suma)
from t1
group by Suma
ми показва колко пъти в таблицата t1 я има сумата Suma, но това, което искам е и да ми покаже кои са ID-tata на тези редове - тоест всички полета t1_pk , които участват в сумата
ако напиша това:
select Suma, Count(Suma), t1_pk
from t1
group by Suma, t1_pk
тогава не сумира това, което искам ... тоест дори и да имам еднакви полета Suma, то няма да им направи Count, защото t1_pk им са различни ...
Това предполагам е General SQL въпрос и няма нужда да споменавам базата каква е (Oracle e :))
Дано сте ме разбрали, по-точно не мога да го обясня
Благодаря
Re: SQL Count Question
Bate, te zatova agergatenite funkcii se narichat agregatni :)
Software-no mojesh da si nabutash id-tata, koito te interesuvat v niakyv string bez problemi, no samo sys zaiavka az pone sym pochti ubeden che ne mojesh da napravish :)
E ... ako izvyrtish vishko v edin cursor i butash id-tata v niakakva promenliva - da, no predpolagam ti ne pitash za tova :)
Software-no mojesh da si nabutash id-tata, koito te interesuvat v niakyv string bez problemi, no samo sys zaiavka az pone sym pochti ubeden che ne mojesh da napravish :)
E ... ako izvyrtish vishko v edin cursor i butash id-tata v niakakva promenliva - da, no predpolagam ti ne pitash za tova :)
Re: SQL Count Question
Май най-добре да си премислиш цялостната постановка на въпроса.
Иначе по принцип има един дървен начин. Да направиш
... GROUP BY Suma, t1_pk WITH ROLLUP;
и за COUNT(*) да взимаш само междинните суми а пък t1_pk от различните редове преди това. Ама това е толкова далече колкото и да си го направиш изцяло откъм клиента.
Въпросът ти всъщност няма кой знае колко смисъл защото
COUNT(Suma) ще преброи всички редове за които Suma IS NOT NULL
salle.online.bg/sig
Иначе по принцип има един дървен начин. Да направиш
... GROUP BY Suma, t1_pk WITH ROLLUP;
и за COUNT(*) да взимаш само междинните суми а пък t1_pk от различните редове преди това. Ама това е толкова далече колкото и да си го направиш изцяло откъм клиента.
Въпросът ти всъщност няма кой знае колко смисъл защото
COUNT(Suma) ще преброи всички редове за които Suma IS NOT NULL
salle.online.bg/sig
Re: SQL Count Question
Това което мисля че ще ти помогне се нарича Analytic functions, ето и какво изкарах чрез такава заявка, тази заявка изписва по групи всички суми , като за всяка сума изписва всяко ID от Primary key-ия и броя суми:
zloster@ora81> select * from t1;
T1_PK SUMA
---------- ----------
1 1000
2 1000
3 1000
4 1100
5 1100
6 1200
6 rows selected.
Elapsed: 00:00:00.00
zloster@ora81>
zloster@ora81> break on suma skip 1
zloster@ora81>
zloster@ora81> select t1_pk,
2 suma ,
3 count(suma) over( partition by suma order by t1_pk ) group_sum
4 from t1;
T1_PK SUMA GROUP_SUM
---------- ---------- ----------
1 1000 1
2 1000 2
3 1000 3
4 1100 1
5 1100 2
6 1200 1
6 rows selected.
Надявам се да ти свърши работа
А ето и как можеш да извадиш вече преброените суми използвайки горната заявка като подзаявка на следващата:
select t1_pk,
suma,
max(group_sum) over( partition by suma ) as all_count
from(
select t1_pk,
suma ,
count(suma) over( partition by suma order by t1_pk ) group_sum
from t1 );
T1_PK SUMA ALL_COUNT
---------- ---------- ----------
1 1000 3
2 1000 3
3 1000 3
4 1100 2
5 1100 2
6 1200 1
Mисля че вече това е нужния резултат!
Ако не е кажи може да измислим нещо друго, или се разрови в документацията за тези функции...
Защо да правим нещата лесно...
zloster@ora81> select * from t1;
T1_PK SUMA
---------- ----------
1 1000
2 1000
3 1000
4 1100
5 1100
6 1200
6 rows selected.
Elapsed: 00:00:00.00
zloster@ora81>
zloster@ora81> break on suma skip 1
zloster@ora81>
zloster@ora81> select t1_pk,
2 suma ,
3 count(suma) over( partition by suma order by t1_pk ) group_sum
4 from t1;
T1_PK SUMA GROUP_SUM
---------- ---------- ----------
1 1000 1
2 1000 2
3 1000 3
4 1100 1
5 1100 2
6 1200 1
6 rows selected.
Надявам се да ти свърши работа
А ето и как можеш да извадиш вече преброените суми използвайки горната заявка като подзаявка на следващата:
select t1_pk,
suma,
max(group_sum) over( partition by suma ) as all_count
from(
select t1_pk,
suma ,
count(suma) over( partition by suma order by t1_pk ) group_sum
from t1 );
T1_PK SUMA ALL_COUNT
---------- ---------- ----------
1 1000 3
2 1000 3
3 1000 3
4 1100 2
5 1100 2
6 1200 1
Mисля че вече това е нужния резултат!
Ако не е кажи може да измислим нещо друго, или се разрови в документацията за тези функции...
Защо да правим нещата лесно...
Редактирано от Zloster на
Re: SQL Count Question
мдам, ясно ... направих го с два курсора ... свърши ми работа
Благодаря на всички
Благодаря на всички