Jednoczesne sumowanie kolumn i wierszy oraz multiplikacja kolumn
bebop - 29-03-2006 00:26
Jednoczesne sumowanie kolumn i wierszy oraz multiplikacja kolumn
Witam
jest problemik: w jaki sposob zoptymalizowac zapytanie lub jak je przedstawic, by w prosty sposob dodac dowolna ilosc kolumn (zalezna od warunkow) oraz w ten sam sposob zsumowac je wierszami?
istnieja 2 tabele. CREATE TABLE TYPY_GOSPODARSTW( ID INT PRIMARY KEY, DESCRIBTION VARCHAR2(35)); CREATE TABLE RESEARCH_TYPY_GOSPODARSTW ( LICZB_OS_W_RODZINIE INT NOT NULL, TYP_GOSPODARSTW INT REFERENCES TYPY_GOSPODARSTW(ID)); ------------------------------------------------------------------------------ jako rezultat chcialbym otrzymac wyniki w postaci DESCRIBTION | 1 | 2 | ..... | 10 i wieej | suma wierszy |
problem jaki sie zarysowuje to,duza ilosc blokow, przy 10 kolumnach zapytanie jest IMHO nadto rozbudowane (ograniczone do 2 ma ponad 60 linii). (osobom zainteresowanym moge przeslac przykladowe dane oraz pelne zapytanie z ograniczeniem do 4 osob/typ)
zapytanie z przyczyn praktycznych zostalo okrojone do 2 osob/typ i 2 typow; wyniki sumowan do 4 i nie beda sie z soba pokrywaly
--------------------------------------------------------------------------------
SELECT T.DESCRIBTION, (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=1 AND R.LICZB_OS_W_RODZINIE=1 GROUP BY T.DESCRIBTION)"1", (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=1 AND R.LICZB_OS_W_RODZINIE=2 GROUP BY T.DESCRIBTION)"2", (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=1 AND R.LICZB_OS_W_RODZINIE <4 GROUP BY T.DESCRIBTION)"SUM" FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=1 GROUP BY T.DESCRIBTION
UNION
SELECT T.DESCRIBTION, (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=2 AND R.LICZB_OS_W_RODZINIE=1 GROUP BY T.DESCRIBTION)"1", (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=2 AND R.LICZB_OS_W_RODZINIE=2 GROUP BY T.DESCRIBTION)"2", (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=2 AND R.LICZB_OS_W_RODZINIE <4 GROUP BY T.DESCRIBTION)"SUM" FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=2 GROUP BY T.DESCRIBTION
UNION
SELECT TO_CHAR('SUM:'), (SELECT COUNT(TYP_GOSPODARSTW) FROM RESEARCH_TYPY_GOSPODARSTW WHERE LICZB_OS_W_RODZINIE=1)"1", (SELECT COUNT(TYP_GOSPODARSTW) FROM RESEARCH_TYPY_GOSPODARSTW WHERE LICZB_OS_W_RODZINIE=2)"2", (SELECT COUNT(R.LICZB_OS_W_RODZINIE) FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE T.ID=R.TYP_GOSPODARSTW AND T.ID=4 AND R.LICZB_OS_W_RODZINIE <4 GROUP BY T.DESCRIBTION)"SUM" FROM TYPY_GOSPODARSTW
-- pozdropit 'uwazam odpowiedz za uzyteczna w 10%'
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-03-2006 00:27
Użytkownik bebop napisał: > Witam > > > -------------------------------------------------------------------------------- > > SELECT T.DESCRIBTION, > (SELECT COUNT(R.LICZB_OS_W_RODZINIE) > FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R > WHERE T.ID=R.TYP_GOSPODARSTW > AND T.ID=1 AND R.LICZB_OS_W_RODZINIE=1 > GROUP BY T.DESCRIBTION)"1", > (SELECT COUNT(R.LICZB_OS_W_RODZINIE) > FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R > WHERE T.ID=R.TYP_GOSPODARSTW > AND T.ID=1 AND R.LICZB_OS_W_RODZINIE=2 > GROUP BY T.DESCRIBTION)"2", > (SELECT COUNT(R.LICZB_OS_W_RODZINIE) > FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R > WHERE T.ID=R.TYP_GOSPODARSTW > AND T.ID=1 AND R.LICZB_OS_W_RODZINIE <4 > GROUP BY T.DESCRIBTION)"SUM" > FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R > WHERE T.ID=R.TYP_GOSPODARSTW > AND T.ID=1 > GROUP BY T.DESCRIBTION
Zamiast UNION: AND T.ID in (1,2) GROUP by T.ID, T.DESCRIBTION
No i zamiast subselectów zastosowałbym CASE.
-- P.M.
bebop - 29-03-2006 00:27
Paweł Matejski wrote:
> Zamiast UNION: > AND T.ID in (1,2) > GROUP by T.ID, T.DESCRIBTION > No i zamiast subselectów zastosowałbym CASE. Liczy pieknie, BIG THX :)
Mialbym jeszcze 2 kwestie: Czy mozna zrobic sumowanie kolumn bez UNION? Dlaczego warunek (THEN) w konstrukcji z CASE jest ignorowany? Wpisanie dowolnej wartosci zwraca wynik poprawny
SELECT T.DESCRIBTION, COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE=1 THEN 1 ELSE NULL END) "1", COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE=2 THEN 1 ELSE NULL END) "2", COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE=3 THEN 1 ELSE NULL END) "3", COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE >0 THEN 1 ELSE NULL END) "SUM:" FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE R.TYP_GOSPODARSTW=T.ID AND T.ID IN (1,2,3,4) GROUP BY T.ID,T.DESCRIBTION
UNION
SELECT TO_CHAR('SUM:'), COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE=1 THEN 1 ELSE NULL END) "1", COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE=2 THEN 1 ELSE NULL END) "2", COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE=3 THEN 1 ELSE NULL END) "3", COUNT(CASE WHEN R.LICZB_OS_W_RODZINIE >0 THEN 1 ELSE NULL END) "SUM:" FROM TYPY_GOSPODARSTW T, RESEARCH_TYPY_GOSPODARSTW R WHERE R.TYP_GOSPODARSTW=T.ID
-- bebop gg:3195835
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 29-03-2006 00:27
Użytkownik bebop napisał: > Paweł Matejski wrote: > > Mialbym jeszcze 2 kwestie: > Czy mozna zrobic sumowanie kolumn bez UNION?
Nie, albo tak jak Ty to robisz, ale najczęściej liczy sie to już w kliencie - nie trzeba wtedy dwa razy czytać tabeli.
> Dlaczego warunek (THEN) w konstrukcji z CASE jest ignorowany? > Wpisanie dowolnej wartosci zwraca wynik poprawny
Bo count rozrużnia 2 wartości, albo null albo not null. Uzyj SUM
-- P.M.
bebop - 29-03-2006 00:27
Paweł Matejski wrote:
> Nie, albo tak jak Ty to robisz, ale najczęściej liczy sie to już w kliencie > - nie trzeba wtedy dwa razy czytać tabeli. na ogol robilem to w excelu, jako kalkulator bywa ok ;)
> Bo count rozrużnia 2 wartości, albo null albo not null. Uzyj SUM wszystko jasne, THX :)
Zastosowanie COUNT przedstawia czestotliwosc wystepowania zjawiska, natomiast SUM przedstawia liczebnosci.
-- pozdropit 'uwazam odpowiedz za uzyteczna w 10%'
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Skopiowanie =?ISO-8859-2?Q?warto=B6ci_z_jednego_po?==?ISO-8859-2?Q?la_do_drugiego_w_jednej_tabeli=2C_r=F3=BFne_?= =?ISO-8859-2?Q?wiersze=2E?=
[Oracle] =?ISO-8859-2?Q?=A3=B1czenie_wierszy_z_zapytania_?==?ISO-8859-2?Q?w_jeden_string?=
=?ISO-8859-2?Q?=5BOracle=5D_Porownanie_wierszy_z_tych_?==?ISO-8859-2?Q?samych_tablic_na_2_r=F3=BFnych_schematach?=
[MS SQL 2005] =?windows-1250?Q?Ilo=9C=E6_wiersz=F3w_w_zbiorze_wynikowym?=
Wstawianie nowego wiersza w przypadku jego braku podczas SELECT w PostgreSQL
MSSQL: =?iso-8859-2?Q?por=F3wnanie_dw=F3ch?= wierszy?
[MySQL] wiele =?ISO-8859-2?Q?rekord=F3w_-=3E_jeden_wiersz?=
SELECT: =?iso-8859-2?Q?po=B3=B1czenie?= kilku wierszy
count(*), jak pokazać wiersze bez wartości przy grupowaniu
[Oracle] numerowanie wierszy według danej wartości
zanotowane.pldoc.pisz.plpdf.pisz.plmisida.pev.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 |
|