Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   bessere SQL Abfrage (https://www.delphipraxis.net/206939-bessere-sql-abfrage.html)

LoZe 10. Feb 2021 16:01

Datenbank: MSSQL • Version: 14 • Zugriff über: SP

bessere SQL Abfrage
 
Hallo ich habe eine MSSQL Tabelle in diesen Format (kann nicht geändert werden)
Code:
[Objekt] [Atribut] [Value]
Müller   City     City1     
Müller   Street   Street1   
Müller   Num      1234     
Mayer    City     City2     
Mayer    Street   Street2   
Mayer    Num      4321
Was ist der Beste Weg um dies zu bekommen?
Code:
[Objekt] [Street] [City]   [Number]
Mayer    Street2   City2     4321
Müller   Street1   City1     1234
bisher löse ich es so:
Code:
DECLARE @allObj TABLE ( Objekt NVARCHAR(12))
INSERT @allObj
SELECT Objekt FROM Table_1_Test group by Objekt

SELECT Tab2.Objekt,
   (SELECT [Value] FROM [Table_1_Test] WHERE [Objekt] = Tab2.Objekt AND [Atribut] = 'Street') AS [Street],
   (SELECT [Value] FROM [Table_1_Test] WHERE [Objekt] = Tab2.Objekt AND [Atribut] = 'City') AS [City],
   (SELECT [Value] FROM [Table_1_Test] WHERE [Objekt] = Tab2.Objekt AND [Atribut] = 'Num') AS [Number]
From @allObj as Tab2
hat jemand ne bessere Möglichkeit?

DeddyH 10. Feb 2021 16:13

AW: bessere SQL Abfrage
 
Klappt das hier?
SQL-Code:
SELECT
  T1.Objekt AS Objekt,
  T2.Value AS Street,
  T3.Value AS City,
  T4.Value AS Number
FROM
  Table_1_Test T1
  LEFT JOIN Table_1_Test T2 ON T2.Objekt = T1.Objekt AND T2.Attribut = 'Street'
  LEFT JOIN Table_1_Test T3 ON T3.Objekt = T1.Objekt AND T3.Attribut = 'City'
  LEFT JOIN Table_1_Test T4 ON T4.Objekt = T1.Objekt AND T4.Attribut = 'Num'
GROUP BY
  T1.Objekt, T2.Value, T3.Value, T4.Value

LoZe 10. Feb 2021 16:24

AW: bessere SQL Abfrage
 
Leider nicht
Code:
Die Table_1_Test.Value-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
so geht es:
Code:
SELECT
  distinct T1.Objekt AS Objekt,
  T2.Value AS Street,
  T3.Value AS City,
  T4.Value AS Number
FROM
  Table_1_Test T1
  LEFT JOIN Table_1_Test T2 ON T2.Objekt = T1.Objekt AND T2.Atribut = 'Street'
  LEFT JOIN Table_1_Test T3 ON T3.Objekt = T1.Objekt AND T3.Atribut = 'City'
  LEFT JOIN Table_1_Test T4 ON T4.Objekt = T1.Objekt AND T4.Atribut = 'Num'
vielen dank für den Tipp

DeddyH 10. Feb 2021 16:31

AW: bessere SQL Abfrage
 
Das war mir auch noch nachträglich eingefallen, daher mein Edit. Wobei das alles irgendwie suboptimal ist, das liegt aber eher an der Struktur.

LoZe 10. Feb 2021 16:39

AW: bessere SQL Abfrage
 
die Struktur ist leider vorgegeben und kann nicht geändert werden :-(
aber jetzt läuft es mal um einiges schneller als mit meiner Variante.

jobo 10. Feb 2021 19:14

AW: bessere SQL Abfrage
 
wenn die Ausgangsdaten per Order By über Objekt, Attribut (was besseres scheint es ja nicht zu geben) in eine definierte Reihenfolge gebracht werden können und garantiert immer alle 3 Elemente drin sind, könnte man es mit Windows Functions und Lag/Lead versuchen.
Damit käme man ohne Joins aus und hätte wahrscheinlich nur einen (einzigen) Single Scan über die Table. Das würde sich bei größeren Datenmengen vielleicht lohnen.

himitsu 10. Feb 2021 19:18

AW: bessere SQL Abfrage
 
In einigen DBMS gibt es Features oder nachrüstbare Funktionen für eine POVIT-Abfrage,
in welcher man quasi eine Tabelle drehen kann, also aus Zeilen werden Spalten oder andersrum.

https://modern-sql.com/de/anwendung/pivot
z.B. https://www.postgresql.org/docs/9.1/tablefunc.html

Aber ja, oftmals macht man das wohl über Joins bzw. Sub-Selects oder bissl gewöhnungbedürftiger mit GroupBy+Aggregate+Filter.

LoZe 11. Feb 2021 05:41

AW: bessere SQL Abfrage
 
Ich habe die Struktur ja nur Beispielhaft dargestellt.

es sind 1 Millionen Reihen an Datensätzen,
leider sind nicht immer alle Attribute gegeben,
und bei einigen Attributen (3 Stück) können auch mehrere Reihen da sein.

Ich habe im Moment jeden Tag ein Task laufen der mir die Daten in einer Anderen Tabelle in einem besseres Format Ablegt.
dort sind es dann nur noch ca 250 Reihen mit ca 20 Spalten.

diesen Taks will ich aber beschleunigen da dieser mittlerweile ca. 30 Minuten braucht

generic 11. Feb 2021 08:33

AW: bessere SQL Abfrage
 
Die Idee von himitsu mit dem PIVOT finde ich auch nicht so schlecht.

Ist der Primärschlüssel auf [Objekt] und [Attribut] ggf. sogar Clustered ?
Evtl. kann man mit einer StoredProcedure/Tablefunction und einen Cursor da als "Tabellescan" schneller durchgehen und die Datensätze zusammenbauen.

Du kannst auch mal prüfen ob ein columnstore Index etwas für dich ist.

Ansonsten bau Trigger auf Tabelle, welche deine LIVE aktualisiert.

LoZe 11. Feb 2021 09:45

AW: bessere SQL Abfrage
 
Ja ich werde mir das mal anschauen, danke mal für die infos


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz