Pomoc s kodem – MS SQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomoc s kodem – MS SQL – Fórum – Programujte.comPomoc s kodem – MS SQL – Fórum – Programujte.com

 

Shockwave
~ Anonymní uživatel
107 příspěvků
8. 4. 2017   #1
-
0
-

Zdravím, potřeboval bych pomoci s překladem kodu z učebnice, přijde mi, že to trošku odflákli.

Odkaz:  http://shockwave3.rajce.idnes.cz/Kniha_kontrola/#IMG_20170408_1446361.jpg

Kdyby měl prosím někdo znalý čas popsat, 1.co se děje na prvním řádku, to SUM  , COUNT

2. group by o.partnum - to bude asi řazení do skupin podle partnum v tabulce o, že

3.ale pak už se v tom uplně ztrácím, co se děje na řádku HAVING

4. proč si najednou označili o1  p1 a proč a na posledním řádku je podmínka

WHERE p1.partnum=o1.partnum

AND  p1.partnum=o.partnum  /  tohle už nikde nikdo neřeší

Myslím si, že učebnice za 800, zvláště pro začátečníka by mohla být popsána podrobněji.

Je to učebnice "Naučte se SQL za 28 dní", pro zajímavost. 

Člověk by pak nemusel vyloženě škemrat o radu a zdržovat na forech. Děkuji moc

Nahlásit jako SPAM
IP: 78.156.128.–
P
~ Anonymní uživatel
212 příspěvků
8. 4. 2017   #2
-
0
-

Cilem prikladu je to co pisou - ukazat, ze korelovany poddotaz lze pouzit v klauzuli HAVING pri fltrovani vysledku GROUP BY. Korelovany poddotaz je to v zavorkach na konci za znakem >. Vrati prumernou castku z objednavek pro dany partnum, z hlavniho dotazu. S touto hodnotou se porovnava celkova suma objednavek pro partnum. Jestli ten cely priklad dava smysl to nevim. Rekl bych, ze ta suma bude vzdycky vetsi nez prumer, pouze v pripade, ze pro dany partnum byla jen jedina objednavka, tak bude suma stejna jako prumer.

Nahlásit jako SPAM
IP: 95.82.135.–
Shockwave
~ Anonymní uživatel
107 příspěvků
9. 4. 2017   #3
-
0
-

#2 P
tak jsem si ten kod zkusil v php admin a kod original mi nabídne stejny vysledek jako kod #2, kde dám pryč and p1.partnum = o.partnum 
a stejny vysledek jako kod #3, kde sem kod select za having zmenil na 

 (select avg(o.quantity * p.price)  from orders o, part p);

takže zde v tomto příkladu nechápu, proč tady tabulky znovu a znovu připojované nazývali jiným jménem nebo propojili pres p1.partnum = o.partnum. Děkuji

kod original: 
select o.partnum, sum(o.quantity * p.price), count(p.partnum) 
from orders o , part p where o.partnum = p.partnum 
group by o.partnum having sum(o.quantity * p.price )> 
(select avg(o1.quantity * p1.price) 
from orders o1, part p1 
where p1.partnum = o1.partnum 
and p1.partnum = o.partnum);

kod #2:
select o.partnum, sum(o.quantity * p.price), count(p.partnum)  from orders o , part p where o.partnum = p.partnum  group by o.partnum having sum(o.quantity * p.price )>  (select avg(o1.quantity * p1.price)  from orders o1, part p1  where p1.partnum = o1.partnum  );

kod#3: 
select o.partnum, sum(o.quantity * p.price), count(p.partnum)  from orders o , part p where o.partnum = p.partnum  group by o.partnum having sum(o.quantity * p.price )>  (select avg(o.quantity * p.price)  from orders o, part p where p.partnum = o.partnum  );
 

Nahlásit jako SPAM
IP: 78.156.128.–
gna
~ Anonymní uživatel
1874 příspěvků
9. 4. 2017   #4
-
0
-

#1 Shockwave

1. co se děje na prvním řádku, to SUM  , COUNT

SUM vrací součet hodnot, COUNT vrací počet hodnot. 

select * from t;
a | b
--+--
0 | 1
0 | 1
1 | 1
1 | 2
2 | 3
2 | 4

select count(a), sum(b) from t;
count(a) | sum(b)
---------+-------
6        | 12

2. group by o.partnum - to bude asi řazení do skupin podle partnum v tabulce o, že

Ano, podle té hodnoty se záznamy seskupí. Agregační funkce pak pracují s těmi skupinami. 

select a, count(a), sum(b) from t group by a;
a | count(a) | sum(b)
--+----------+-------
0 | 2        | 2
1 | 2        | 3
2 | 2        | 7

3. ale pak už se v tom uplně ztrácím, co se děje na řádku HAVING

HAVING určuje podmínku, podlé které se to filtruje. Jakoby WHERE pro agregace. 

select a, count(a), sum(b) from t group by a having sum(b) > 2;
a | count(a) | sum(b)
--+----------+-------
1 | 2        | 3
2 | 2        | 7

Tady se chce, aby ta suma byla větší než nějaká hodnota -- hodnota zjištěná poddotazem.

4. proč si najednou označili o1  p1

Je to korelovaný poddotaz, tzn. že
- se spouští pro každý záznam vnějšího dotazu
- používá hodnotu z vnějšího dotazu

Takže se asi docela hodí, když ty názvy nekolidují, že?

a proč a na posledním řádku je podmínka

WHERE p1.partnum=o1.partnum

Podle toho se ti ty tabulky sloučí.

AND  p1.partnum=o.partnum

A podle toho se ti vybere to co hledáš -- pro ten vnější záznam.

tohle už nikde nikdo neřeší

Co na tom nechápeš?

Myslím si, že učebnice za 800, zvláště pro začátečníka by mohla být popsána podrobněji.

Myslím si, že to tam všechno je. Pořád se ptáš na primitivní věci, základy. Tak se prostě vrať kousek zpátky. Bude hůř :-)

Nahlásit jako SPAM
IP: 213.211.51.–
P
~ Anonymní uživatel
212 příspěvků
9. 4. 2017   #5
-
0
-

#3 Shockwave
Jaky mas v tech tabulkach data?

Nahlásit jako SPAM
IP: 95.82.135.–
peter
~ Anonymní uživatel
4002 příspěvků
10. 4. 2017   #6
-
0
-

 http://www.dpriver.com/pp/sqlformat.htm

SELECT o.partnum,
       Sum(o.quantity * p.price),
       Count(p.partnum)
FROM   orders o,
       part p
WHERE  o.partnum = p.partnum
GROUP  BY o.partnum
HAVING Sum(o.quantity * p.price) > (SELECT Avg(o1.quantity * p1.price)
                                    FROM   orders o1,
                                           part p1
                                    WHERE  p1.partnum = o1.partnum);  
SELECT o.partnum,
       Sum(o.quantity * p.price),
       Count(p.partnum)
FROM   orders o,
       part p
WHERE  o.partnum = p.partnum

1. To je hlavni dotaz.

2. Ktery potrebujes z nejake duvodu grupovat, podle o.partnum.

3. A having tam je proto, ze pracujes s hodnotami, ktere vznikaji po grupovani. Jakoze where plati pro vyber radku pro grupovani a kdyz grupujes, tak having je takove druhe where, ktere plati pro grupovane radky. Proste, nemuzes do where dat sum(neco), protoze v puvodnich tabulkach ten soucet nemas. Ten muzes ziskat jen pri grupovani.

4. A dva aliasy pro stejne tabulky... Vis, ale v tom druhem selectu muzes pouzit promenne, jak z tech tabulek o,p, tak z o1, p1 a je treba to odlisit. Ten druhy select s tim prvnim nesouvisi. Vysledkem toho selectu je jedine cislo.
Priklad, druhy select rekneme udela prumer cen pro vsechny knihy typu ucebnice. prvni select s group vybira vsechny knihy, ktere maji spolecne tema (anglictina, dejepis, ...), spojuje je pomoci toho group a v having potom to tridi jeste, aby byla cena vetsi nez prumer. Zajima te proste, kolik knih v danem tematu ma vetsi cenu nez prumerna ucebnice. (Takhle, jak to popisuji, je to samozrejme neuzitecne a verim, ze puvodni sql ma vyznam, ale nechce se mi to studovat)

 

Nahlásit jako SPAM
IP: 2001:718:2601:26c:c97f:7b...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Pomoc s kodem — založil ask@t

Exception, pomoc s kodem — založil shockwave

Pomoc s kodem, subquery, ALL — založil shockwave

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý