ďťż
 
Jednoczesne sumowanie kolumn i wierszy oraz multiplikacja kolumn ďťż
 
Jednoczesne sumowanie kolumn i wierszy oraz multiplikacja kolumn
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • misida.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com