Forum Delphi.cz

Databáze => MS SQL => Téma založeno: Morrison 08-09-2017, 08:10:29

Název: dotaz sum
Přispěvatel: Morrison 08-09-2017, 08:10:29
Zdravím vespolek,
nějak se nemůžu dopracovat funkční query k následujícímu problému. Budu vděčný za radu.

Mám tabulky Položky a Data, v Položkách je hlavička a v Datech jsou řádky. Jak vyselectit sumu sloupce Data.Skutecne, joinout Položky.Požadavek a navíc to seskupit podle Data.Nazev? Viz příloha.

Mám:
Kód: [Vybrat]
SELECT D.Nazev,SUM(D.Skutecne),SUM(P.Pozadavek)
FROM Data D
LEFT JOIN Polozky P ON D.ID_Polozky=P.ID
GROUP BY Nazev
jenže to mi násobí sloupec Položky.Požadavek vždy tolikrát, kolik je pro položku řádků v tab. Data
Název: Re:dotaz sum
Přispěvatel: Stanislav Hruška 08-09-2017, 08:18:46
Ja to vidím na subselect. Najprv si urobiť samostatne súčty, podľa ID a nie názvu. Riskuješ, že sa budú opakovať názvy, ale ID bude rôzne. A až tento subselect použiť namiesto tabuľky Data.
Takéto prípady so mnou pár krát ťažko zacvičili.
Název: Re:dotaz sum
Přispěvatel: Morrison 08-09-2017, 08:41:42
Díky za odpovědi.

Stanislav Hruška: subquery neprojde, protože ID_Polozky není zahrnut ani v aggregate ani ani v group by. A když to dám do group by, tak pochopitelně zase nedostanu co řádek to jeden název :(
Kód: [Vybrat]
SELECT D.Nazev,SUM(D.Skutecne),(SELECT SUM(P.Pozadavek) FROM Polozky WHERE ID=D.ID_Polozky)
FROM Data D
GROUP BY D.Nazev

Delfin: to bohužel nejde :) Položek je víc než jen ty dvě co jsem dal do ukázky, a potřebuju sumu jejich Požadavků.

EDIT: upravil jsem obrázek
Název: Re:dotaz sum
Přispěvatel: Morrison 08-09-2017, 08:56:58
Delfin: To bohužel taky nejde, protože Data.Název patřící ke stejné položce může být různý. Jde o hmotnosti nějakých surovin a když třeba k určitému požadavku dojde materiál A, může být klidně nahrazen materiálem B.
Nechci vypadat nevděčně, fakt jsem moc rád za takové rychlé odpovědi.
Název: Re:dotaz sum
Přispěvatel: Stanislav Hruška 08-09-2017, 09:03:48
Citace
A až tento subselect použiť namiesto tabuľky Data.
Asi Ti to ušlo. To znamená, že subselect má byť až po FROM a nie súčasťou SELECT.
Název: Re:dotaz sum
Přispěvatel: 96917 08-09-2017, 09:18:47
Uz tomu rozumim. To bez subselectu nepujde (nebo me alespon nenapada jak). Nelze totiz seskupit vazbu ciziho klice, tj. z tohoto pri joinovani a seskupeni jeden radek neudelas:

Nazev   ID_Polozky
frem      21
frem      23

Kdyby si chtel nekdo hrat (http://sqlfiddle.com/#!9/59881) :)
Název: Re:dotaz sum
Přispěvatel: martinnr 08-09-2017, 09:52:48
super paskvil, ktory dava pozadovany vysledok:

select min(n), sum(s), sum(p) from
(SELECT min(a.NAZEV) as n, sum(a.SKUTECNE) as s, min(b.POZADAVEK) as p, b.ID
FROM POLOZKY b
left join DATA a
on a.ID_POLOZKY = b.ID
group by b.ID)
group by n
Název: Re:dotaz sum
Přispěvatel: Morrison 08-09-2017, 11:34:59
Díky moc všem! SQLFiddle jsem neznal a je to super věc. Subquery podle martinnr funguje, teď už mi zbývá jenom ji pochopit :D
Název: Re:dotaz sum
Přispěvatel: martinnr 08-09-2017, 14:25:22
no, ak som to ja dobre pochopil, tak potrebujes sice ziskat vypis podla stlpca "nazov" v "data", ale zaroven nechces zratavat/nasobit mnozstva v "polozky".
takze ja tam nasjkor urobim join z "polozky" (to je 2. az 6. riadok, teda ten vnutorny select v zatvorkach) a k tomu priradim prislusne previazane zaznamy z data, ktore uz mozem skumulovat/scitat (to je ten sum(a.skutecne)).
a min(b.pozadavek) mi zabezpeci, ze tieto hodnoty pri zgrupovani nebude zratavat, ale da minimalnu hodnotu, ale kedze pre zgrupnute zaznamy je tato hodnota rovnaka, tak minimum z rovnakych hodnot je vzdy len ta hodnota (min z hodnot 20,20,20,20 je vzdy 20). resp. je jedno aku funkciu pouzijem (min, max, avg a pod, ale nie sum).
POZOR - pocitam, ze v tabulke polozky, moze byt kazde ID iba raz, ak som to dobre pochopil. ak nie, teda by sa tam objavilo viac rovnakych ID s roznou hodnotou "pozadavek" , tak to nebude fungovat dobre. tam by bolo treba osetrit, ze co s tou hodnotou "pozadavek" sa ma urobit, teda uz vedome podla potreby pouzit min/max/avg/sum a pod.
a min a sum v prvom riadku su len kvoli group by z posledneho riadku, ktory to vyzaduje, resp. min/max a sum (alebo ine funkcie) pouzijeme podla toho, co potrebujeme ziskat, ci sucet alebo len konkretnu hodnotu (ktora je zase rovnaka/konstantna pre zlucovane zaznamy).

no vidim, ze som stvoril asi este zlozitejsi popis, ako bolo povodne sql...
Název: Re:dotaz sum
Přispěvatel: < z > 08-09-2017, 18:39:04
Takový hloupý dotaz - co je na tomto špatně?

Kód: [Vybrat]
SELECT D.Nazev,SUM(D.Skutecne),(P.Pozadavek)
FROM Data D
LEFT JOIN Polozky P ON D.ID_Polozky=P.ID
GROUP BY Nazev
Název: Re:dotaz sum
Přispěvatel: Morrison 10-09-2017, 18:36:48
martinnr: díky i za vysvětlení, už to (snad) chápu. Položky.ID je skutečně unikátní, je to primary key.
< z >: To SQL engine nesežere kvůli P.Pozadavek, protože "it is not contained in either an aggregate function or the GROUP BY clause"
Název: Re:dotaz sum
Přispěvatel: martinnr 11-09-2017, 08:28:57
martinnr: díky i za vysvětlení, už to (snad) chápu. Položky.ID je skutečně unikátní, je to primary key.
< z >: To SQL engine nesežere kvůli P.Pozadavek, protože "it is not contained in either an aggregate function or the GROUP BY clause"

no tam by stacilo zase (tak ako som pisal) nejaku matematicku funkciu, ktora vrati to co ma - MIN(P.Pozadavek) alebo SUM(P.Pozadavek) - pretoze sql nevie, co ma s tou hodnotou urobit, ked zgrupuje zaznamy. to je jediny nedostatok. cloveku to mozno pride samozrejme, ze vsak vsetky zlucene zaznamy maju tu istu hodnotu, ale pre sql to nie je samozrejme. ale v takom pripade to MIN (pripadne MAx, AVG) v pohode vyriesia, to je cele.