Autor Téma: Transformácia DataSetu  (Přečteno 439 krát)

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Transformácia DataSetu
« Odpověď #15 kdy: 15-11-2022, 15:56:42 »
Obě moje odpovědi vezmou ten první dataset a udělají z něj ten druhý dataset.
Ty bys akorát vyměnil ten vnitřní dotaz, který já tam dal, abych měl nějaká data, za svůj, který už teď nejspíš někde máš.
Tj. použil bys ode mne:
Kód: [Vybrat]
SELECT
 x.Rok,
 SUM(CASE WHEN x.f00<0 THEN NULL ELSE x.f00 END) as f00,
 SUM(CASE WHEN x.f01<0 THEN NULL ELSE x.f01 END) as f01,
 SUM(CASE WHEN x.f02<0 THEN NULL ELSE x.f02 END) as f02
FROM
(

... tady by byl Tvůj SELECT, který Ti nyní vytváří ten první dataset

) x
GROUP BY x.Rok

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #16 kdy: 15-11-2022, 15:58:46 »
Nerozumiem  ;D , ale vyskúšam!
To som nebol schopný urobiť.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #17 kdy: 15-11-2022, 16:05:59 »
Paráda, funguje to ;D ;D ;D  Vyriešil si mi všetky základné problémy 8)  Máš u mňa bozk. Eee, pivo.
Len som zvedavý ako to riešiť, ak tie polia f00...f02 nebudú zhodné. Mám na mysli to, že v každom roku bude čosi iné. Mám k tomu ID. Mám tak nasimulované údaje, tak uvidím.
« Poslední změna: 15-11-2022, 16:08:33 od Stanislav Hruška »
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #18 kdy: 15-11-2022, 18:10:49 »
V niečo také som nedúfal. Mám tam všetko čo tam má byť. Viď koniec prílohy.
SQL sú trochu divoké. Kto je zvedavý tak sú v druhej prílohe. Ale ich generovanie bude jednoduché.
.
Mám jednu otázočku.
Ak mám v zdroji len jeden riadok, ušetrím zdroje/zrýchlim výpočet ak namiesto Sum() použijem List()? 
.
Dávam obrovské ďakujem.
« Poslední změna: 15-11-2022, 18:22:31 od Stanislav Hruška »
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Transformácia DataSetu
« Odpověď #19 kdy: 15-11-2022, 19:09:01 »
Rádo se stalo.

A musí tam vůbec být to LIST? Jak na to tak letmo koukám, přijde mi, že bys ho mohl vypustit, ne?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #20 kdy: 15-11-2022, 20:29:51 »
Na všetko čo chcem mať ako polia hlavičky v mriežke, musím mať agregačnú funkciu. Ináč to neurobí to čo potrebujem. Na text platí jedine List.
Ja som sa pýtal či je List menej náročný než Sum. Na to som odpoveď nedostal. Pri mojom počte záznamov sa to neprejaví. Ale aj tak to chcem vedieť.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1435
  • Karma: 52
    • Verze Delphi: 10.3
Re:Transformácia DataSetu
« Odpověď #21 kdy: 15-11-2022, 21:57:34 »
Na všetko čo chcem mať ako polia hlavičky v mriežke, musím mať agregačnú funkciu. Ináč to neurobí to čo potrebujem. Na text platí jedine List.
... nebo to dát do GROUP BY.
LIST nejspíš vrátí string, což teda může vadit, nebo nemusí, stejně nevím, jakého typu je D.TS, ale tipuju, že integer.
Možná by tam místo LIST šlo použít třeba MAX, MIN apod.

Ja som sa pýtal či je List menej náročný než Sum. Na to som odpoveď nedostal. Pri mojom počte záznamov sa to neprejaví. Ale aj tak to chcem vedieť.
To nevím, mají natolik jiné použití, že jsem je nikdy nepotřeboval porovnávat.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #22 kdy: 16-11-2022, 08:45:41 »

Nemyslím si, žeby mi Group pomohol. Skúšať sa mi to nechce, keď navrhnuté riešenie funguje :D Veď som písal, že na "text" platí jedine List. TS = TitleShort = string. Áno, List vráti string. Nevadí to, lebo mám vždy jedinú položku. Tak isto pri Sum. Tu prichádza do úvahy Max či Min.
Osobne si akosi neviem vymyslieť situáciu kde by sa mi List hodil pre viac položiek. Jeho výsledok treba určite dodatočne analyzovať.
Aj odpoveď neviem je odpoveď. Ďakujem.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #23 kdy: 17-11-2022, 17:07:24 »
Nakoniec som ten LIST musel vyhodiť. FastCube ho ignoroval. Dal som tam MAX a je to v poriadku.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #24 kdy: 22-11-2022, 09:25:44 »
Mám príjemné prekvapenie 8)  Na základe konzultácii a ukážky zdroja údajov pre Cube som pochopil, že prevod na stĺpce robí Cube!
Preto mi stačí jednoduchý SQL
Kód: [Vybrat]
SELECT SP.PERIOD AS PER, B.TITLE AS BT, E.TITLEFULL AS ET, S.TITLESHORT, SUM(D.DEPOSIT) AS DEP, SUM(D.PAY) AS PAY
FROM DEPOSITS D
  INNER JOIN OWNER_FLAT OWF ON D.FKOWNER_FLAT = OWF.IDOWNER_FLAT
  INNER JOIN FLATS F ON OWF.FKFLAT = F.IDFLATS
  INNER JOIN ENTRIES E ON F.FKENTRY = E.IDENTRIES
  INNER JOIN BLOCKS B ON E.FKBLOCKS = B.IDBLOCKS
  INNER JOIN SERVICEPARAMETERS SP ON D.FKSERVICEPARAMETERS = SP.IDSERVICEPARAMETERS
  INNER JOIN SERVICES S ON SP.FKSERVICES = S.IDSERVICES
WHERE  D.FKFOCS = :FKFOCS AND SP.PERIOD BETWEEN :YEARFROM AND :YEARTO
GROUP BY SP.PERIOD, B.TITLE, E.TITLEFULL, S.TITLESHORT
ORDER BY PER, BT, ET
Venoval som tomu veľa času, ale som sa aj čosi naučil :D ;)
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Hrdina
  • ****
  • Příspěvků: 316
  • Karma: 4
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Transformácia DataSetu
« Odpověď #25 kdy: 23-11-2022, 07:38:29 »
To přece nevadí, že roky mají různý počet služeb. S jedním selectem a CASE pro jednotlivé služby transformaci zvládneš.
Při přidání služby to znamená, že musíš upravit i select.
Pokud budeš používat uložené procedury, tak číselník, který přidává služby může vygenerovat i upravenou uloženou proceduru pro transformaci. Případně může vygenerovat obsah SQL dotazu, který budeš používat z klienta.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6867
  • Karma: 44
    • Verze Delphi: W10 + D11.1
Re:Transformácia DataSetu
« Odpověď #26 kdy: 23-11-2022, 10:07:23 »
Excellent
Rated 1 time
Celý vtip je v tom, že tú transformáciu vykoná FastCube!!! Viď môj predošlý príspevok. To mi akosi nedochádzalo :o ::) :-[
Tvorbu SQL so mal zvládnutú. Len mi robila šarapatu. Riešil som problémy, ktoré som si vyrobil umelo. Akonáhle som dodal "plochý" DataSet, tak všetko išlo podľa mojich predstáv. Trvalo to vééééľmi dlho kým mi to došlo. Pritom viem čo je krížová/pivot tabuľka.
Boli to nejaké 3 - 4 dni "trápenia", ale hlavne učenia.
Win11 64b, Delphi 11.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.