Forum Delphi.cz

Databáze => Firebird a Interbase => Téma založeno: Stanislav Hruška 14-12-2018, 16:29:33

Název: Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 16:29:33
Kód: [Vybrat]

SELECT DISTINCT
...
  SUM(CASE WHEN D.FKSERVICEPARAMETERS = 1879 THEN D.DEPOSIT ELSE 0 END) AS FIELD17,
  SUM(CASE WHEN D.FKSERVICEPARAMETERS = 1693 THEN D.DEPOSIT ELSE 0 END) AS FIELD18,
  SUM(CASE WHEN D.FKSERVICEPARAMETERS = 16861 THEN D.DEPOSIT ELSE 0 END) AS FIELD19,
  SUM(CASE WHEN D.FKSERVICEPARAMETERS = 16937 THEN D.DEPOSIT ELSE 0 END) AS FIELD20,
  OWF.IDOWNER_FLAT,
  D.IDDEPOSITS,
  SP.PRIORITY,
  EXTRACT(MONTH FROM D.DEPOSITPERIOD) AS MYMONTH,
  D.DEPOSITPERIOD,
  SP.IDSERVICEPARAMETERS
FROM
  SERVICEPARAMETERS SP
  LEFT OUTER JOIN DEPOSITS D ON (SP.IDSERVICEPARAMETERS = D.FKSERVICEPARAMETERS)
  INNER JOIN OWNER_FLAT OWF ON (D.FKOWNER_FLAT = OWF.IDOWNER_FLAT)
  INNER JOIN SERVICES S ON (S.IDSERVICES = SP.FKSERVICES)
GROUP BY OWF.IDOWNER_FLAT, D.IDDEPOSITS, SP.PRIORITY, EXTRACT(MONTH FROM D.DEPOSITPERIOD), D.DEPOSITPERIOD, SP.IDSERVICEPARAMETERS
HAVING OWF.IDOWNER_FLAT = 1835 AND D.DEPOSITPERIOD = '1.9.2016'
Posledné tri FKSERVICEPARAMETERS 1693, 16861, 16937 nie sú v tabuľke DEPOSITS. Ja ich tam potrebujem.
LEFT OUTER JOIN mi to nevyriešil.
Prikladám aj grafickú podobu.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 17:32:49
Upresňujem, že všade mám použité SP.IDSERVICEPARAMETERS a nie D.FKSERVICEPARAMETERS
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 18:32:28
Pripadám si akoby som v živote neurobil ani jedno SQL. NULL mi nezobrazí ani toto
Kód: [Vybrat]
SELECT
  D.FKSERVICEPARAMETERS
FROM
  SERVICEPARAMETERS SP
  INNER JOIN SERVICES S ON (SP.FKSERVICES = S.IDSERVICES)
  LEFT OUTER JOIN DEPOSITS D ON (SP.IDSERVICEPARAMETERS = D.FKSERVICEPARAMETERS)
WHERE
  S.FKFOCS = 1776 AND
  SP.PERIOD = 2016
ORDER BY
  SP.IDSERVICEPARAMETERS
To už vôbec nerozumiem prečo. Veď sa to už jednoduchšie urobiť nedá
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 18:47:26
K požadovanému výsledku som sa dostal, až keď som si vytvoril pohľady z vyfiltrovanými záznamami. Nikdy neviem odhadnúť kedy mám robiť subselect/pohľad a kedy nie.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 18:53:56
Hovno, keď tam dám celý výber tak je to zas o ničom.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 19:09:03
Som celkom mimo. Ak idem v pohľade pre Deposit po jednotlivých mesiacoch (DepositPeriod), tak dostávam správne výsledky. Ináč nie. Vôbec nerozumiem prečo.
Vie mi to niekto vysvetliť?


Skladať to po jednotlivých mesiacoch sa mi akosi nechce. Prieči sa mi to. Nie je to z môjho pohľadu čisté. Ale ak si ináč povedať nedá ...
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 19:36:03

To SQL používam ako skratku pre dopyty.

Kód: [Vybrat]
SELECT DISTINCT  ID_DEP.IDDEPOSITS,  ID_DEP.FKSERVICEPARAMETERS,  ID_DEP.FKOWNER_FLAT,  ID_DEP.DEPOSIT,
  ID_DEP.DEPOSITPERIOD,  ID_SP.IDSERVICEPARAMETERS
FROM  ID_DEP
  FULL OUTER JOIN ID_SP ON (ID_DEP.FKSERVICEPARAMETERS = ID_SP.IDSERVICEPARAMETERS)
Toto nemením.
Kód: [Vybrat]
CREATE VIEW ID_DEP(IDDEPOSITS, FKSERVICEPARAMETERS, FKOWNER_FLAT, DEPOSIT, DEPOSITPERIOD)
AS
SELECT DISTINCT D.IDDEPOSITS, D.FKSERVICEPARAMETERS, D.FKOWNER_FLAT, D.DEPOSIT, D.DEPOSITPERIOD
FROM DEPOSITS D
WHERE D.FKOWNER_FLAT = 1835 AND D.DEPOSITPERIOD = '1.9.2016';
V tomto prípade dostávam požadované. Viď obrázok a v ňom prvé tri riadky s null hodnotami. Ak vyhodím podmienku na dátum D.DEPOSITPERIOD = '1.9.2016', tak sa k null hodnotám nedopracujem. To je celý problém.



Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 20:09:23
Citace
Je treba si uvedomit, ze NULL neni hodnota, ale stav
To viem, už som to pár ľuďom vysvetľoval.
Tvoj návrh výsledok nepriniesol.
Filtrovaný podľa dátumu musí byť už zdroj z ktorého sa ťahajú údaje "Deposit". Jedine tak sa dostanem k správnym výsledkom.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 20:33:10
Pravdu povediac som zabudol na skutočnosť, že je rozdiel napísať podmienku do WHERE a JOIN. Aj keď so doteraz nepochopil prečo. Použil som
Kód: [Vybrat]
  RIGHT OUTER JOIN ID_SP ON (ID_DEP.FKSERVICEPARAMETERS = ID_SP.IDSERVICEPARAMETERS)
AND (ID_SP.IDSERVICEPARAMETERS IS NULL)
a dostal som naraz všetky záznamy s NULL. To znamená, že to už dám dokopy pomocou UNION.
Ďakujem
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 23:21:02
Mám knihy o SQL. Jednu pekne hrubú. Ale žeby sa tam rozpisovali o tom, aký je rozdiel medzi podmienkami v JOIN a WHERE tak to nie. Niečo som už zistil. Odkaz si pozrem.
Tešil som sa predčasne. Dostávam záznamy s NULL, ktoré tam nemajú byť. Ešte sa tým potrápim. Vidím to tak, že to budem musieť urobiť na viac krokov. A len v DB to nezvládnem.

Len stručný popis stavu a čo chcem.
Každý vlastník bytu má na služby vystavené predpisy. To je u mňa tabuľka DEPOSITS
- obdobie vlastnenia bytu nemusí byť počas celého roka. To kopírujú predpisy.
- v tabuľke DEPOSITS nemusia byť všetky služby
- v tabuľke DEPOSITS môžu byť služby len v niektorých mesiacoch


Hovädo jedno. Nepozrel som sa, že nepodporuje csv a zmazal mi zyšok príspevku. Už druhýkrát. :'(
Takže v krátkosti. Výsledkom má byť tabuľku kde služby budú hlavička, mesiace riadky a predpisy v bunkách. Vystavené - nulové - nevystavené/neexistujúce. Tie údaje potrebujem dostať do "riadkovej" tabuľky v štruktúre IDDEPOSITS,  IDSERVICEPARAMETERS, DEPOSIT a DEPOSITPERIOD.
K tomu ešte mám tabuľku predpisov SERVICEPARAMETERS. Z oboch tabuliek som priložil export csv premenovaný na txt. Okrem FKOWNER_FLAT = 1835 netreba údaje filtrovať. Viac k tomu nič nemám.
Kód: [Vybrat]

CREATE TABLE DEPOSITS (
  IDDEPOSITS PRIMARYKEY NOT NULL,
  FKFOCS FOREIGNKEY NOT NULL,
  FKOWNER_FLAT FOREIGNKEY NOT NULL,
  FKSERVICEPARAMETERS FOREIGNKEY NOT NULL,
  DEPOSIT CURRENCY DEFAULT '0.0' NOT NULL,
  DEPOSITPERIOD DATEFROM NOT NULL,
  PAY CURRENCY DEFAULT 0 NOT NULL);
Dobrú noc!


Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 14-12-2018, 23:30:39
Jaj ešte niečo. Pri prevode na stĺpce mi dopyt doplní niektoré chýbajúce údaje. Ale nie kompletne. Ak bude záujem, tak môžem zajtra poslať čo mám a čo potrebujem.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: pf1957 15-12-2018, 07:55:58
Mám knihy o SQL. Jednu pekne hrubú. Ale žeby sa tam rozpisovali o tom, aký je rozdiel medzi podmienkami v JOIN a WHERE tak to nie.
Nevim jak v knihach, ale mam pocit, ze kdykoli narazim na cokoli o joinovani, ze to tam vice ci mene podrobne vysvetluji ev. ilustruji priklady. ted jsem namatkou vygooglil
https://community.modeanalytics.com/sql/tutorial/sql-joins-where-vs-on/ (https://community.modeanalytics.com/sql/tutorial/sql-joins-where-vs-on/)

Jinak pro pomoc ev. hrani si s SQL dotazy se pouzivaji fiddlery, ktere samozrejme pro tebe predstavuji praci na vic, ale donuti te vytvorit kompletni priklad problemu vcetne dat a das tak sanci i nekomu jinemu se zabyvat tvym problemem viz treba sqlfiddle.com (http://sqlfiddle.com). Sice to neni pro ptaka ohnivaka, ale u rady problemu je to jedno a da se pouzit i jiny RDBMS.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 15-12-2018, 09:18:29
Ďakujem obom. Ja si najpv idem urobiť poriadnu hĺbkovú nanalýzu toho čo vlastne vidím na obrazovke. Ja totiž pri napĺňaní stromu pridávam niektoré chýbajúce údaje ručne. Ja v skutočnosti neviem ako mi korenšpondujú so skutočnosťou :-[  Obrovská chyba. Žiaľ, to je pre mňa typické. Ale už to je lepšie než to bolo. Bola tam jedna chyba, ktorú som odstránil. Možno ani nie je čo riešiť.
Takže sa aj ospravedlňujem.
Citace
Jinak pro pomoc ev. hrani si s SQL dotazy se pouzivaji fiddlery, ktere samozrejme pro tebe predstavuji praci na vic,
Nejde o prácu navyšše. Ja som to kedysi skúšal s nulovým výsledkom. Hlavne kvôli FB.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 15-12-2018, 10:39:57
Citace
navic obcas oponujes i vcelku vhodnym radam
Hm, to nie je pravda :)  Aj keď to tak vyznieva. Stáva sa mi to aj v bežnom v živote. Ja tak vlastne nahlas rozmýšľam. Mám vedomosti aké mám. Ľudia majú dojem, že niekoho zhadzujem, vysmievam sa, chcem sa hádať a pod :(  Pritom sledujem jedinú vec. Ísť viac do hĺbky a viac sa dozvedieť. Či si to sám sebe vyjasniť.
Ja som vždy rozmýšľal nejako ináč než ostatní ľudia. Veľmi často ma nechápu. Zvyčajne to dokážem vysvetliť. Aj preto tvrdím, že som nikdy nebol normálny.
A teraz do analýzy.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 15-12-2018, 12:56:00
Takže po analýze je jasné, že dopyt je v poriadku. Zle je jeho spracovanie. Ale vďaka analýze ho vidím. Keď mňa tie analýzy prestali baviť. Nič iné nerobím.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: Stanislav Hruška 18-12-2018, 16:50:23
Ten odkaz čo tu dal pf1957 je perfektný. Jednoducho polopate, zrozumiteľne a všetky možnosti využitia. S tým som sa ešte inde nestretol.
Název: Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
Přispěvatel: pf1957 18-12-2018, 19:21:49
Ten odkaz čo tu dal pf1957 je perfektný. Jednoducho polopate, zrozumiteľne a všetky možnosti využitia. S tým som sa ešte inde nestretol.
No, hledal jsem puvodne neco jineho, protoze nedavno jsem pri googleni kolem OUTER APPLY narazil na clanek, ktery mel spoustu zajimavych prikladu na pouziti On/Where, ale nenasel jsem. Misto nej na me vyskocil tenhle, tak jsem ti ho poslal. Ale tech clanku je skutecne cela rada.