AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

bessere SQL Abfrage

Ein Thema von LoZe · begonnen am 10. Feb 2021 · letzter Beitrag vom 11. Feb 2021
Antwort Antwort
Seite 1 von 2  1 2   
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
19 Beiträge
 
Delphi 10.3 Rio
 
#1

bessere SQL Abfrage

  Alt 10. Feb 2021, 17:01
Datenbank: MSSQL • Version: 14 • Zugriff über: SP
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?
Chris

Geändert von LoZe (10. Feb 2021 um 17:04 Uhr) Grund: schlechter Titel
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.261 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 17:13
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (10. Feb 2021 um 17:22 Uhr) Grund: Gruppierung erweitert
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
19 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 17:24
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
Chris
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.261 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 17:31
Das war mir auch noch nachträglich eingefallen, daher mein Edit. Wobei das alles irgendwie suboptimal ist, das liegt aber eher an der Struktur.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
19 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 17:39
die Struktur ist leider vorgegeben und kann nicht geändert werden
aber jetzt läuft es mal um einiges schneller als mit meiner Variante.
Chris
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.949 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 20:14
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.399 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: bessere SQL Abfrage

  Alt 10. Feb 2021, 20:18
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (10. Feb 2021 um 20:41 Uhr)
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
19 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 06:41
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
Chris
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.359 Beiträge
 
Delphi XE5 Professional
 
#9

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 09:33
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/channel/UCUG...aXLclwO9qA-lzA

Geändert von generic (11. Feb 2021 um 09:37 Uhr)
  Mit Zitat antworten Zitat
LoZe

Registriert seit: 27. Dez 2016
Ort: Ulm
19 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: bessere SQL Abfrage

  Alt 11. Feb 2021, 10:45
Ja ich werde mir das mal anschauen, danke mal für die infos
Chris
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 19:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf