Autor Téma: Transportovanie riadkov na stlpce  (Přečteno 555 krát)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 4
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Transportovanie riadkov na stlpce
« kdy: 26-09-2018, 14:32:18 »
mam tabulku

meno   hodnota   typ
aa   2   a1
aa   5   a2
aa   6   a3
aa   78   a4
aa   2   a5
bb   1   a1
bb   8   a2
bb   5   a3
bb   2   a5
cc   5   a1
cc   4   a2
cc   89   a4
cc   22   a5

a potrebujem z nej urobit toto:


   a1   a2   a3   a4   a5
aa   2   5   6   78   2
bb   1   8   5   null   2
cc   5   4   null   89   22

existuje nejaky sposob v ramci SQL?

existuje na to vlakno aj tu
https://groups.google.com/forum/#!topic/firebird_cz/pN1IlVFvSOo

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 488
  • Karma: 36
    • Verze Delphi: 10.2
Re:Transportovanie riadkov na stlpce
« Odpověď #1 kdy: 26-09-2018, 14:56:58 »
Dotaz, který by vracel předem neznámý počet sloupců, se IMHO napsat nedá. Pokud ale víš, že sloupce budou a1, a2, a3, a4 a a5, tak už se něco připravit dá. Pomocí SELECT DISTINCT se vyberou jedinečné hodnoty z pole Meno a pro ně se pak budou dohledávat data dle typu.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 4
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Transportovanie riadkov na stlpce
« Odpověď #2 kdy: 26-09-2018, 15:22:33 »
môže to byť aj procedúra, ten počet stĺpcov je ale variabilný

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3526
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Transportovanie riadkov na stlpce
« Odpověď #3 kdy: 26-09-2018, 15:29:51 »
Citace
Dotaz, který by vracel předem neznámý počet sloupců, se IMHO napsat nedá
Ale dá. Až prídem domov, tak to vyhľadám.
Možno Ti postačí to čo je v prílohe.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1216
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Transportovanie riadkov na stlpce
« Odpověď #4 kdy: 26-09-2018, 15:38:20 »
Rika se tomu pivot table.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 488
  • Karma: 36
    • Verze Delphi: 10.2
Re:Transportovanie riadkov na stlpce
« Odpověď #5 kdy: 26-09-2018, 15:39:40 »
Citace
Dotaz, který by vracel předem neznámý počet sloupců, se IMHO napsat nedá
Ale dá. Až prídem domov, tak to vyhľadám.

Tak to chci vidět :-)

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1216
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Transportovanie riadkov na stlpce
« Odpověď #6 kdy: 26-09-2018, 15:50:32 »
Tak to chci vidět :-)

Mrkni na odkaz co jsem poslal ;)
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3526
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Transportovanie riadkov na stlpce
« Odpověď #7 kdy: 26-09-2018, 17:08:06 »

Mám riadkovú tabuľku:
Kód: [Vybrat]
CREATE TABLE DEPOSITS (
  IDDEPOSITS PRIMARYKEY NOT NULL,
  FKFOCS FOREIGNKEY NOT NULL,
  FKLANDLORD_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);
Tá Františkova tiež vyzerá na riadkovú.
Snáď to pomôže. Je to funkčné. Najprv si získam zoznam jednotlivých stĺpcov. To sú FKSERVICEPARAMETERS z tabuľky DEPOSITS. Z tohto zoznamu si vygenerujem SQL, ktoré mi prevedie riadky na stĺpce + tam mám aj iné stĺpce.
Kód: [Vybrat]
  FstlFieldOfDeposit: TStringList;


procedure TMakeDepositEdits.GetFieldsOfDeposit;
begin
  FstlFieldOfDeposit.Clear;
  FqryFieldOfDeposit.ParamByName('FKFOCS').Value := oGlobalVar.IDFOC;
  FqryFieldOfDeposit.ParamByName('YEARS').Value := oGlobalVar.CurrentYear;
  FqryFieldOfDeposit.ParamByName('PERIOD').Value := oGlobalVar.CurrentYear;
  FqryFieldOfDeposit.Open;


  while not FqryFieldOfDeposit.Eof do
  begin
    FstlFieldOfDeposit.AddObject(FqryFieldOfDeposit.FieldByName('Titleshort').AsWideString,
      TObject(FqryFieldOfDeposit.FieldByName('IDSERVICEPARAMETERS').AsInteger));
    FqryFieldOfDeposit.Next;
  end;


  FqryFieldOfDeposit.Close;
  FNumberOfEdtit := FstlFieldOfDeposit.Count;
end;


constructor TMakeDepositEdits.Create(AOwner: TComponent);
begin
  FParent := AOwner;
  FstlFieldOfDeposit := TStringList.Create;
  FoblsListEdit := TObjectList<TAdvEdit>.Create(True);


  FqryFieldOfDeposit := QryRead(nil);
  FqryFieldOfDeposit.SQL.Text :=
  'SELECT DISTINCT SP.IDSERVICEPARAMETERS, SP.PRIORITY, S.TITLESHORT'+
  ' FROM SERVICEPARAMETERS SP'+
    ' INNER JOIN SERVICES S ON (SP.FKSERVICES = S.IDSERVICES)'+
    ' INNER JOIN DEPOSITS D ON (SP.IDSERVICEPARAMETERS = D.FKSERVICEPARAMETERS)'+
  ' WHERE (D.FKFOCS = :FKFOCS) AND SP.PERIOD = :PERIOD AND'+
    ' (EXTRACT(YEAR FROM D.DEPOSITPERIOD) BETWEEN :YEARS AND :YEARS)'+
  ' ORDER BY SP.PRIORITY';
end;


function TMakeDepositEdits.LandolrdAndMonthPaySQLText(const APeriod: TDate): string;
var
  SQLText, Text: string;
  I: Integer;
begin
  SQLText := 'SELECT DISTINCT ';


  for I := 0 to FstlFieldOfDeposit.Count -1 do
  begin
    Text := 'SUM(CASE WHEN (D.FKSERVICEPARAMETERS ='+  IntToStr(Integer(FstlFieldOfDeposit.Objects[I])) +
      ') THEN D.Pay ELSE 0 END) as Field' + IntToStr(I)+',';
    SQLText := SQLText + Text;
  end;


  Result := SQLText +
    ' LF.IDLANDLORD_FLAT, D.IDDEPOSITS, SP.PRIORITY, D.FKSERVICEPARAMETERS'+
  ' FROM SERVICEPARAMETERS SP'+
    ' INNER JOIN DEPOSITS D ON (SP.IDSERVICEPARAMETERS = D.FKSERVICEPARAMETERS)'+
    ' INNER JOIN LANDLORD_FLAT LF ON (D.FKLANDLORD_FLAT = LF.IDLANDLORD_FLAT)'+
    ' INNER JOIN SERVICES S ON (S.IDSERVICES = SP.FKSERVICES)'+
  ' WHERE (LF.IDLANDLORD_FLAT = :IDLANDLORD_FLAT) AND (D.DEPOSITPERIOD ='+ ''''+ DateToStr(APeriod)+''''+')'+
  ' GROUP BY LF.IDLANDLORD_FLAT, D.IDDEPOSITS, SP.PRIORITY, D.FKSERVICEPARAMETERS'+
  ' ORDER BY SP.PRIORITY';
end;
Prosím, len žiadne doplňujúce otázky. To by som musel po študovať zdrojáky po sebe. A to by som nerád :)

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

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 488
  • Karma: 36
    • Verze Delphi: 10.2
Re:Transportovanie riadkov na stlpce
« Odpověď #8 kdy: 26-09-2018, 19:27:03 »
Tak to chci vidět :-)

Mrkni na odkaz co jsem poslal ;)

No ale to v prvním kroku poskládají SQL dotaz a ve druhém ho pak spustí, ne?

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1216
  • Karma: 53
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Transportovanie riadkov na stlpce
« Odpověď #9 kdy: 26-09-2018, 19:38:33 »
No ale to v prvním kroku poskládají SQL dotaz a ve druhém ho pak spustí, ne?

Dobre, ale jde o Firebird. Pokud neumi nativne pivot tabulky, jak bys to chtel jinak vyresit?
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 488
  • Karma: 36
    • Verze Delphi: 10.2
Re:Transportovanie riadkov na stlpce
« Odpověď #10 kdy: 26-09-2018, 19:39:45 »
Dobre, ale jde o Firebird. Pokud neumi nativne pivot tabulky, jak bys to chtel jinak vyresit?

No proto jsem psal "to chci vidět" :-) To si můžu ten SQL dotaz poskládat i v Delphi...

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2275
  • Karma: 123
    • Verze Delphi: D2007, XE3, DX10
Re:Transportovanie riadkov na stlpce
« Odpověď #11 kdy: 26-09-2018, 19:40:11 »
Dobre, ale jde o Firebird. Pokud neumi nativne pivot tabulky, jak bys to chtel jinak vyresit?
My to delame proceduralne v SP, ale stejne je to hnus.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 3526
  • Karma: 35
    • Verze Delphi: XE7 professional
Re:Transportovanie riadkov na stlpce
« Odpověď #12 kdy: 26-09-2018, 19:52:19 »
Citace
To si můžu ten SQL dotaz poskládat i v Delphi...
Veď to tam robím :P  Otázka znela či sa to dá. Dá ;D Jaj, v rámci SQL. To som si neuvedomil. O to som sa ani nesnažil. Ale iní píšu, že to robia pomocou SP.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 423
  • Karma: 4
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Transportovanie riadkov na stlpce
« Odpověď #13 kdy: 26-09-2018, 21:12:37 »
neprekáža mi ani SP ani skladanie v Delfi ... dôležité je pre mňa riešenie/funkčnosť

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 376
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Transportovanie riadkov na stlpce
« Odpověď #14 kdy: 26-09-2018, 21:25:15 »
V Delphi sa dá napísať program, ktorý to vyrieši obecne.
Pred dlhými rokmi, som si PIVOT funkcionalitu, pripravil pre SQL Server. Ďaleko predtým než M$ dodali PIVOT do TRANSACT SQL (už ani neviem ako sa to tam volá). Teraz SQL Server PIVOT zvláda.
Na pivot tabuľky je šikovný MS Acccess.
Syntax:
TRANSFORM .. SELECT .. PIVOT ..
Samotná syntax v Accesss je v podstate GROUP BY rozšírené iba o TRANSFORM A PIVOT parametre.
Ten PIVOT je pomerne silný. Stojí to za nahliadnutie do návodu. Ale v praxi je možností asi viac, než je v bežnom návode.
Chystám sa najmenej tak obsiahlu funkcionalitu zaviesť aj do svojho SQLite
Samozrejme, že to chce nejakú tú snahu. Nebude to rýchla práca. Zistiť výsledné stĺpce z SQL a pod. Klauzula PIVOT napríklad umožňuje vymenovať poradie výsledných polí, alebo vybrať ktoré polia sa vypíšu.. Nie je to maličkosť.

 

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):