Autor Téma: dotaz sum  (Přečteno 488 krát)

Offline Morrison

  • Plnoletý
  • ***
  • Příspěvků: 181
  • Karma: 6
    • Verze Delphi: D5, XE2
dotaz sum
« kdy: 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
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:dotaz sum
« Odpověď #1 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Plnoletý
  • ***
  • Příspěvků: 181
  • Karma: 6
    • Verze Delphi: D5, XE2
Re:dotaz sum
« Odpověď #2 kdy: 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
« Poslední změna: 08-09-2017, 08:47:01 od Morrison »
nil

Offline Morrison

  • Plnoletý
  • ***
  • Příspěvků: 181
  • Karma: 6
    • Verze Delphi: D5, XE2
Re:dotaz sum
« Odpověď #3 kdy: 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.
nil

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:dotaz sum
« Odpověď #4 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Hrdina
  • ****
  • Příspěvků: 362
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:dotaz sum
« Odpověď #5 kdy: 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 :)
« Poslední změna: 08-09-2017, 09:23:11 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 136
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:dotaz sum
« Odpověď #6 kdy: 08-09-2017, 09:52:48 »
Excellent
Rated 1 time
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

Offline Morrison

  • Plnoletý
  • ***
  • Příspěvků: 181
  • Karma: 6
    • Verze Delphi: D5, XE2
Re:dotaz sum
« Odpověď #7 kdy: 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
nil

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 136
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:dotaz sum
« Odpověď #8 kdy: 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...

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1083
  • Karma: 38
    • Verze Delphi: 7, 2010
Re:dotaz sum
« Odpověď #9 kdy: 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

Offline Morrison

  • Plnoletý
  • ***
  • Příspěvků: 181
  • Karma: 6
    • Verze Delphi: D5, XE2
Re:dotaz sum
« Odpověď #10 kdy: 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"
nil

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 136
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:dotaz sum
« Odpověď #11 kdy: 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.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):