Autor Téma: Prevod riadkov na stĺpce - nemám všetko čo chcem  (Přečteno 2604 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #1 kdy: 14-12-2018, 17:32:49 »
Upresňujem, že všade mám použité SP.IDSERVICEPARAMETERS a nie D.FKSERVICEPARAMETERS
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #2 kdy: 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á
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #3 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #4 kdy: 14-12-2018, 18:53:56 »
Hovno, keď tam dám celý výber tak je to zas o ničom.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #5 kdy: 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á ...
« Poslední změna: 14-12-2018, 19:11:44 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1717
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #6 kdy: 14-12-2018, 19:13:43 »
Ja tomuto vlakne absolutne nerozumim. Jsem od Tveho monitoru pomerne daleko :) Snad kdybys vytvoril minimalni, spustitelnou ukazku (idealne se sadou dat a ukazkou aktualniho a ocekavaneho vystupu). Zatim je mi z vlakna jasne jen to, ze se snazis vytvorit pivot tabulku, ale nemam tuseni v cem je problem.

P.S. SQL je jazyk, ten nelze "udelat". V jazyce SQL se daji tvorit prikazy (jinak zvane dotazy). Ted si dovolim pouzit, neni zac! ;D
« Poslední změna: 14-12-2018, 19:15:25 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #7 kdy: 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.



Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1717
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #8 kdy: 14-12-2018, 19:50:32 »
Ak vyhodím podmienku na dátum D.DEPOSITPERIOD = '1.9.2016', tak sa k null hodnotám nedopracujem. To je celý problém.

Je treba si uvedomit, ze NULL neni hodnota, ale stav. Tusim, ze pridanim v pseudokodu (nemam Firebird ani MCVE):

Kód: MySQL [Vybrat]
  1. ...
  2. WHERE D.FKOWNER_FLAT = 1835 AND (D.DEPOSITPERIOD IS NULL OR D.DEPOSITPERIOD = '1.9.2016');

bys mohl dosahnout vysledku. Nicmene, pokud me pamet neklame, to ze NULL je pouze stav a ne hodnota uz jsem i ja (mimo dalsi) nekde tady na foru zminoval.

Vubec ovsem nechapu nadpis tohoto vlakna. Prevod radku na sloupce je o tzv. pivot tabulce, coz jsem tady na mimo nejak fixne (snad generovany) SQL prikaz vubec nenarazil. Jsem zmaten, coz ovsem nevadi. Zajdu si pro vino, jelikoz pritelkyne spi :) Treba to s jinym uhlem pohledu pochopim ;)
« Poslední změna: 14-12-2018, 19:59:31 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #9 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1717
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #10 kdy: 14-12-2018, 20:16:10 »
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.

Vzdavam se (byt to casto nedelam). Opravdu nemam tuseni o co jde. Zkus problem minimalizovat a idealne poskytnout sem. Jeste pripomenu, ze stejne podminky ohledne NULL plati i pro podminky JOIN tabulek (podminky na NULL stav ve Tvych prikazech nevidim, byt netusim zda je to chtene). Tim ovsem bez minimalniho prikladu v tomto vlakne koncim...

Poslu tedy alespon lehce anarchistickou skladbu :) ;)
« Poslední změna: 14-12-2018, 20:27:19 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #11 kdy: 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
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1717
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #12 kdy: 14-12-2018, 21:18:43 »
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

De nada! Porad netusim o co jde, protoze co prispevek v tomto vlakne, to jiny prikaz (bezici terc). Nicmene, ta skutecnost s NULL stavem plati v SQL vsude, tedy i podminkach JOIN operaci (operator rovnosti pro zahrnuti zaznamu se stavem NULL nestaci).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online Delfin

  • Padawan
  • ******
  • Příspěvků: 1717
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #13 kdy: 14-12-2018, 22:10:17 »
Ke cteni bych doporucil napr. clanek z clanek z Wikipedie, v tomto pripade tedy cast Joins ;)
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4103
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:Prevod riadkov na stĺpce - nemám všetko čo chcem
« Odpověď #14 kdy: 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!


Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.