Jak to resit pomoci SQL ?

Karel Zak zakkr na zf.jcu.cz
Úterý Březen 11 10:25:43 CET 2003


On Tue, Mar 11, 2003 at 09:39:58AM +0100, Frantisek Darena wrote:
> 
> Tohle by melo fungovat, zkousel jsem na oracle (ta imaginarni tabulka se
> jmenuje iin, protoze in je povazovany za ten operator).
> F. Darena
> 
> SELECT DISTINCT substr(tabulka.rule, 0, length(tabulka.rule)-4) as rule,
> 	iin.data AS data_in,
> 	out.data AS data_out
> 
> FROM (SELECT substr(rule, 0, length(tabulka.rule)-4) as rule, data
> 	FROM tabulka
> 	WHERE rule LIKE '%-->'
>      ) iin,
>      (SELECT substr(rule, 0, length(tabulka.rule)-4) as rule, data
> 	FROM tabulka
> 	WHERE rule LIKE '%<--'
>      ) out,
>      tabulka
> WHERE substr(tabulka.rule, 0, length(tabulka.rule)-4) = iin.rule
>      AND substr(tabulka.rule, 0, length(tabulka.rule)-4) = out.rule
> 

 Zajimave zadani, jen par poznamek. Pouzivani tech "rule" v podobe
 "<--" nebo "-->" primo uvnitr atributu, ktery se pouziva samostatne je z
 databazovaho pohledu pekna prasarnicka (neodpovida to ani 1. normalni
 forme:-). To by melo byt vyreseno uz pri vkladani tech dat.

 Zkousel jsem reseni co bere jako moznost, ze u nekoho neexistuje
 dvojice zaznamu nebo ze pro jeden ze smeru (in / out) je vice zaznamu.

 (smer je urcen pomoci boolean 'isin')

SELECT * FROM rule ORDER BY name;
 name | isin | data  
------+------+-------
 AAA  | t    |   125
 AAA  | f    |    25
 AAA  | f    | 10000
 BBB  | t    |  1025
 BBB  | f    |  1000
 CCC  | t    |   100
 CCC  | f    |    46
 DDD  | f    |    46
 EEE  | t    | 40000


SELECT name, i.data AS in, o.data AS out 
FROM  (
    SELECT name, sum(data) AS data FROM rule WHERE isin='t' GROUP BY name
) i FULL JOIN (
    SELECT name, sum(data) AS data FROM rule WHERE isin='f' GROUP BY name
) o USING( name );

 name |  in   |  out  
------+-------+-------
 AAA  |   125 | 10025
 BBB  |  1025 |  1000
 CCC  |   100 |    46
 DDD  |       |    46
 EEE  | 40000 |      


    Karel

-- 
 Karel Zak  <zakkr na zf.jcu.cz>
 http://home.zf.jcu.cz/~zakkr/


Další informace o konferenci Test