SQL Count Question

4 отговора 224 прегледа
#1

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 :))
Дано сте ме разбрали, по-точно не мога да го обясня
Благодаря


Отговор
в отговор на legato #2

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 :)

Отговор
в отговор на legato #3

Re: SQL Count Question

Май най-добре да си премислиш цялостната постановка на въпроса.

Иначе по принцип има един дървен начин. Да направиш

... GROUP BY Suma, t1_pk WITH ROLLUP;

и за COUNT(*) да взимаш само междинните суми а пък t1_pk от различните редове преди това. Ама това е толкова далече колкото и да си го направиш изцяло откъм клиента.

Въпросът ти всъщност няма кой знае колко смисъл защото
COUNT(Suma) ще преброи всички редове за които Suma IS NOT NULL

salle.online.bg/sig
Отговор
в отговор на legato #4

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 на

Отговор
в отговор на lnsOmnia #5

Re: SQL Count Question

мдам, ясно ... направих го с два курсора ... свърши ми работа

Благодаря на всички

Отговор