ZLICZANIE W SELECT
SP - 28-08-2007 00:08
ZLICZANIE W SELECT
Posiadam 2 tabele
OSOBA z polami ID_OSOBA IMIE NAZWISKO
oraz WYNIKI z polami: ID_OSOBA ODP_UZYTKOW IL_PUNKT_ODP
Chciałbym zrobić SELECT-a , który 1) zsumuje pole IL_PUNKT_ODP dla każdej osoby (to nie jest problem) 2) zliczy ile razy wystąpiła następująca zależność ODP_UZYTKOW=TRUE i IL_PUNKT_ODP>0 lub ODP_UZYTKOW=FALSE i IL_PUNKT_ODP>0
czyli np. ODP_UZYTKOW=TRUE IL_PUNKT_ODP = 5 ODP_UZYTKOW=TRUE IL_PUNKT_ODP = -5 (nie zliczaj) ODP_UZYTKOW=FALSE IL_PUNKT_ODP = -5 (nie zliczaj) ODP_UZYTKOW=FALSE IL_PUNKT_ODP = 5
pole zliczone=2 Poproszę o pomoc w zakodowaniu tego.
Jarek - 28-08-2007 00:08
> Użytkownik "SP" <spytlik@interia.pl> napisał w wiadomości > > news:1188238230.056636.116520@y42g2000hsy.googlegr oups.com... > Posiadam 2 tabele > OSOBA z polami > ID_OSOBA > IMIE > NAZWISKO > > oraz WYNIKI z polami: > ID_OSOBA > ODP_UZYTKOW > IL_PUNKT_ODP > > Chciałbym zrobić SELECT-a , który > 1) zsumuje pole IL_PUNKT_ODP dla każdej osoby (to nie jest problem) > 2) zliczy ile razy wystąpiła następująca zależność ODP_UZYTKOW=TRUE i > IL_PUNKT_ODP>0 lub ODP_UZYTKOW=FALSE i IL_PUNKT_ODP>0
Powinno działać:
select o.id_osoba, (select sum(w.IL_PUNKT_ODP) from wyniki as w where w.id_osoba = o.id_osoba ) as zlicz_true, (select count(*) from wyniki as w where w.id_osoba = o.id_osoba and w.ODP_UZYTKOW = true and w.IL_PUNKT_ODP>0) as zlicz_true, (select count(*) from wyniki as w where w.id_osoba = o.id_osoba and w.ODP_UZYTKOW = false and w.IL_PUNKT_ODP>0) as zlicz_false from osoba as o
Oczywiście można zrobić to optymalniej. Składnia SQL-92 (np.MSSQL)
pozdr
Jarek
Marcin - 28-08-2007 00:08
SP pisze: > Posiadam 2 tabele > > OSOBA z polami > ID_OSOBA > IMIE > NAZWISKO > > oraz WYNIKI z polami: > ID_OSOBA > ODP_UZYTKOW > IL_PUNKT_ODP > > Chciałbym zrobić SELECT-a , który > 1) zsumuje pole IL_PUNKT_ODP dla każdej osoby (to nie jest problem) > 2) zliczy ile razy wystąpiła następująca zależność ODP_UZYTKOW=TRUE i > IL_PUNKT_ODP>0 lub ODP_UZYTKOW=FALSE i IL_PUNKT_ODP>0 > > czyli np. > ODP_UZYTKOW=TRUE IL_PUNKT_ODP = 5 > ODP_UZYTKOW=TRUE IL_PUNKT_ODP = -5 (nie zliczaj) > ODP_UZYTKOW=FALSE IL_PUNKT_ODP = -5 (nie zliczaj) > ODP_UZYTKOW=FALSE IL_PUNKT_ODP = 5 > > pole zliczone=2 > Poproszę o pomoc w zakodowaniu tego. >
Ad. 2) Wg mnie to się sprowadza do warunku: il_punkt_odp > 0
w mysql można np. tak:
mysql> select count( -> case -> when il_punkt_odp > 0 then 1 -> end -> ) as "pole zliczone" -> from wyniki; +---------------+ | pole zliczone | +---------------+ | 2 | +---------------+ 1 row in set (0.00 sec)
SP - 28-08-2007 00:08
Zapomniałęm napisać że chodzi od MS SQL Dokładnie obenie mój select wygląda tak.
SELECT OSOBA.ID_OSOBA, OSOBA.IMIE, OSOBA.NAZWISKO, GRUPA.NAZWA, COUNT(*) AS IL_POPR, SUM(WYNIKI.IL_PUNKT_ODP) AS SUMA_PUNKTOW FROM WYNIKI INNER JOIN OSOBA ON WYNIKI.ID_OSOBA = OSOBA.ID_OSOBA INNER JOIN GRUPA ON OSOBA.ID_GRUPA = GRUPA.ID_GRUPA WHERE (WYNIKI.ODP_UZYTKOW = 'TRUE') AND (WYNIKI.IL_PUNKT_ODP > 0) OR (WYNIKI.ODP_UZYTKOW = 'FALSE') AND (WYNIKI.IL_PUNKT_ODP > 0) GROUP BY OSOBA.ID_OSOBA, OSOBA.IMIE, OSOBA.NAZWISKO, GRUPA.NAZWA
Ale przy SUM sumuje tylko te które spełniają warunek WHERE a ja chcę aby SUM-ował wszstkie. Jeszcze sprawdzę wasze odpowiedzi ze które dziękuję.
Jarek Stokłosa - 28-08-2007 00:08
>> Użytkownik "SP" <spytlik@interia.pl> napisał w wiadomości >> >> news:1188242824.213475.56180@y42g2000hsy.googlegro ups.com... >> Zapomniałęm napisać że chodzi od MS SQL >> Dokładnie obenie mój select wygląda tak.
Poprawiony Select :
SELECT OSOBA.ID_OSOBA, OSOBA.IMIE, OSOBA.NAZWISKO, GRUPA.NAZWA, COUNT(*) AS IL_POPR, SUM(case when (WYNIKI.ODP_UZYTKOW = 'TRUE') AND (WYNIKI.IL_PUNKT_ODP > 0) then WYNIKI.IL_PUNKT_ODP else 0 end) AS SUMA_PUNKTOW_TRUE, SUM(case when (WYNIKI.ODP_UZYTKOW = 'FALSE') AND (WYNIKI.IL_PUNKT_ODP > 0) then WYNIKI.IL_PUNKT_ODP else 0 end) AS SUMA_PUNKTOW_FALSE FROM WYNIKI INNER JOIN OSOBA ON WYNIKI.ID_OSOBA = OSOBA.ID_OSOBA INNER JOIN GRUPA ON OSOBA.ID_GRUPA = GRUPA.ID_GRUPA WHERE (WYNIKI.ODP_UZYTKOW = 'TRUE') AND (WYNIKI.IL_PUNKT_ODP > 0) OR (WYNIKI.ODP_UZYTKOW = 'FALSE') AND (WYNIKI.IL_PUNKT_ODP > 0) GROUP BY OSOBA.ID_OSOBA, OSOBA.IMIE, OSOBA.NAZWISKO, GRUPA.NAZWA
pozdr
Jarek
SP - 29-08-2007 00:10
Dziękuję
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[help] Illustrator CS - =?ISO-8859-2?Q?znikn=B1=B3_Selection_?==?ISO-8859-2?Q?Tool_=28V=29?=
[mysql 4.0] SELECT t1.id, t1.foo FROM t1 oraz COUNT t2 w jednym zapytaniu.
SELECT MAX(nazwaPola) FROM tabela WHERE .... i ORA-01405: pobran? warto?ci? kolumny jest NULL
=?iso-8859-2?q?select_sum_i_dwie_tabele..._b=B3=EAdna_agregac ja?=
=?iso-8859-2?Q?=5BMySql=5D_-_select_po_5_rekordow_mniejssych_i_wi=EAkszych?=
=?iso-8859-2?Q?=5BMySql=5D_Select_wed=B3ug_nazwy_pola?=
=?ISO-8859-2?Q?[mysql]_Nie_potrafi=EA_zgrupowa=E6_selecta_(proste)?=
=?ISO-8859-2?Q?[MS_SQL]_update_wielu_p=F3l_na_raz_z_selecta?=
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
[pgsql] jak =?ISO-8859-2?Q?zrobi=E6_taki_select_=3F?=
zanotowane.pldoc.pisz.plpdf.pisz.plfelgiuzywane.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|