aximand
Goto Top

Aus einer SELECT DISTINCT Abfrage möchte ich den Wert schrittweise eines Datensatzes ermitteln

Hallo,

gegeben ist eine Abfrage:

select Distinct (KHKKontokorrent.Kto)
FROM         KHKAdressen INNER JOIN
                      KHKKontokorrent ON KHKAdressen.Adresse = KHKKontokorrent.Adresse INNER JOIN
                      KHKStatVKKunden ON KHKKontokorrent.Kto = KHKStatVKKunden.Kunde
					  where KHKAdressen.LieferPLZ like '01%' and KHKStatVKKunden.Periode >= '2016001' and KHKStatVKKunden.Periode <= '2016012'   
					  
Diese liefert jetzt beispielsweise 7 Treffer:
20028
20092
20107
20174
20357
20472
21095

Ich möchte aber nun die Abfrage so erweitern, dass ich wahlweise das Ergebnis (1-7) herausbekomme. Also sozusagen:

select den 4. Treffer aus der Abfrage eingangs. Ich hab da was über rank() gelesen, bekomme das aber nicht umgesetzt.

Hat jemand eine Idee was ich in die Abfrage noch einbastel (als Variable) um zum Ziel zu kommen?

Danke face-smile

Content-Key: 316262

Url: https://administrator.de/contentid/316262

Ausgedruckt am: 19.03.2024 um 04:03 Uhr

Mitglied: emeriks
emeriks 26.09.2016 um 10:30:30 Uhr
Goto Top
Hi,
Du möchstest nur den 4. Satz haben, weil ....? Er der größte, kleinste, schönste ist?

Ansonsten mit "select top 4" in eine Temp-Tabelle kippen und diese Temp-Tabelle umgekehrt sortieren, davon der 1. - das wäre der 4. aus der Gesamt-Liste.

Also irgendwie so:
select top 4 * into newtable ...
..
select from newtabel oder by ... DESC

E.
Mitglied: ukulele-7
Lösung ukulele-7 26.09.2016 um 10:37:51 Uhr
Goto Top
Welcher SQL Server ist das? Bei MS-SQL ginge das hier:
SELECT	t.Kto
FROM	(

SELECT	ROW_NUMBER() OVER (ORDER BY KHKKontokorrent.Kto) AS zeile,
		KHKKontokorrent.Kto
FROM	KHKAdressen
INNER JOIN KHKKontokorrent
ON		KHKAdressen.Adresse = KHKKontokorrent.Adresse
INNER JOIN KHKStatVKKunden
ON		KHKKontokorrent.Kto = KHKStatVKKunden.Kunde 
WHERE	KHKAdressen.LieferPLZ LIKE '01%'  
AND		KHKStatVKKunden.Periode >= '2016001'  
AND		KHKStatVKKunden.Periode <= '2016012'  
GROUP BY KHKKontokorrent.Kto

		) t
WHERE	t.zeile <= 4
Mitglied: em-pie
em-pie 26.09.2016 um 10:38:03 Uhr
Goto Top
Moin,

Was hast du denn damit am Ende vor?
Willst du für einen Report/ ein Programm zwischen den Ergebnissen hin und her springen können?
Wenn ja, wäre es unklik, jedesmal ein SQL-Statement dafür auszuführen.

Besser wäre es, einmal das gesamte Query laufen lassen (natürlich nur mit den relevanten Daten -> where-Clause), das Ergebnis in ein Array schreiben und dann durchs Array "zappen".

Ansonsten: siehe emeriks.

Gruß
em-pie
Mitglied: Aximand
Aximand 26.09.2016 um 10:50:04 Uhr
Goto Top
Was will ich damit tun...

Nun ja, ich möchte für eine grafische Darstellung in Excel die kumulierten Einzelumsätze aus einer Statistiktabelle ziehen.

Vorher muss ich aber ermitteln, wer denn alles an dem Umsatz pro PLZ-Gebiet und Periode beteiligt ist. Daraus resultiert ein Ergebnis "Anzahl beteiligte Kunden"
Mit diesem Ergebnis lasse ich mir dann über VBA x-mal (Anzahl der Kunden) die Umsätze ziehen (das sind im Schnitt 15 Kunden pro PLZ-Gebiet benötige aber die Kundennummer aus der eigentlichen Abfrage oben.
Schön wäre dann eben eine Schleife wo ich sagen kann sag mir Umsatz von Kunde(i), wobei (i) dann der Datensatz 1-7 ist:


Call Aufbau_Datenverbindung

' Ermitteln der ANzahl an Datensätze für Diagramm  
conDB.Open
rst.ActiveConnection = conDB
strSQLQuery = AbfrageAnzahlKundenGebiet((intPLZ), (2016), ("001"), ("012"))  
rst.Open strSQLQuery
            If rst.Fields("AnzahlDatensaetze").Value = "NULL" Then  
            intAnzahlKunden = 0
            ElseIf rst.Fields("AnzahlDatensaetze").Value <> "NULL" Then  
            intAnzahlKunden = rst.Fields("AnzahlDatensaetze").Value  
            End If
            rst.Close

ActiveSheet.Shapes.AddChart(xlColumnClustered, 700, 300, 300, 175).Select
ActiveSheet.ChartObjects(2).Chart.Axes(xlValue).MinimumScale = 0
' Setzen des Diagrammtitels  
ActiveSheet.ChartObjects(2).Chart.HasTitle = True
ActiveSheet.ChartObjects(2).Chart.ChartTitle.Text = "beteiligte Kunden " & intAnzahlKunden  

' Ermitteln der Kundennummern  

rst.ActiveConnection = conDB
strSQLQuery = AbfrageAnzahlKundenGebietKdNR((intPLZ), (2016), ("001"), ("012"))  

For i = 1 To intAnzahlKunden
    rst.Open strSQLQuery
    strKunde(i) = rst.Fields("KHKKontokorrent.Kto").Value  
    rst.Close
Next i




With ActiveChart
    
    For i = 1 To intAnzahlKunden
        rst.ActiveConnection = conDB
        strSQLQuery = AbfrageUmsatzKundenGebiet((intPLZ), (2016), ("001"), ("012"), (strKunde(i)))  
        rst.Open strSQLQuery
            If rst.Fields("Roherloes").Value = "NULL" Then  
                lngRoherloes = 0
                ElseIf rst.Fields("Roherloes").Value <> "NULL" Then  
                lngRoherloes = rst.Fields("Roherloes").Value  
            End If

            If rst.Fields("Umsatz").Value = "NULL" Then  
                lngUmsatz = 0
                ElseIf rst.Fields("Umsatz").Value <> "NULL" Then  
                lngUmsatz = rst.Fields("Umsatz").Value  
            End If

            If rst.Fields("Matchcode").Value = "NULL" Then  
                strMatchcode = ""  
                ElseIf rst.Fields("Matchcode").Value <> "NULL" Then  
                strMatchcode = rst.Fields("Matchcode").Value  
            End If
            rst.Close
         .SeriesCollection.NewSeries
         .SeriesCollection (i)
         ActiveChart.SeriesCollection(i).Name = strMatchcode
         ActiveChart.SeriesCollection(i).Values = lngUmsatz
Mitglied: Biber
Biber 26.09.2016 aktualisiert um 11:52:55 Uhr
Goto Top
Moin Aximand,

sag uns doch bitte - wie auch ukulele-7 schon gefragt hat , von welchem Datenbankblech wir reden.
Von der Strategie her wären row_number() oder, falls es das nicht gibt, eine selbstgebastelte Rank()-Spalte schon richtig.

Wenn wir vom worst case ausgehen (wir reden von Access), dann ist es halt umständlicher als bei echten Datenbankservern. Aber natürlich auch lösbar.

Grüße
Biber
Mitglied: Aximand
Aximand 26.09.2016 aktualisiert um 12:12:52 Uhr
Goto Top
Hallo, MS-SQL 2008R2 row_number() klingt vom Wort her schon toll - ich lese

select distinct KHKKontokorrent.Kto as Kto,  ROW_NUMBER() over(ORDER by KHKKontokorrent.Kto) AS Row
FROM  KHKAdressen INNER JOIN
KHKKontokorrent ON KHKAdressen.Adresse = KHKKontokorrent.Adresse INNER JOIN
KHKStatVKKunden ON KHKKontokorrent.Kto = KHKStatVKKunden.Kunde  where KHKAdressen.LieferPLZ like '01%' and KHKStatVKKunden.Periode >= '2016001' and KHKStatVKKunden.Periode <= '2016012'   

Ergebnis:
Kto Row
20028 1
20028 2
20028 3
20092 4
20092 5
20092 6
20092 7
20092 8
20107 9
20107 10
20174 11
20174 12
20174 13
20357 14
20472 15
21095 16

a) wie kann ich die Kontodubletten ausblenden ( DISTINCT geht nicht mehr aufgrund unterschiedlicher Row-Werte)
b) wie kann ich dann "Row" ansprechen? Denn "and Row = '7' " funktioniert nicht da ungültiger Spaltenname
Mitglied: Aximand
Aximand 26.09.2016 um 12:29:18 Uhr
Goto Top
Danke für die Hilfe face-smile Erstmal ALLE Hilfestellungen lesen, dann fragen ;)
Mitglied: Biber
Biber 26.09.2016 aktualisiert um 12:42:07 Uhr
Goto Top
Moin Aximand,

das hat ukulele-7 doch prinzipiell gezeigt-
Du musst schrittweise mehrere SELECTs verschachteln.

Als innerstes SELECT dein "SELECT DISTINCT KHKKontokorrent.Kto WHERE..".
Oder mit GROUP BY statt DISTINCT , egal

Zweites SELECT drumherum "SELECT kto, ROW_NUMBER OVER (...) as rn FROM (inneres SQL)"

Äußeres SELECT ist dann "SELECT kto FROM (zweites SELECT) WHERE rn =4"

Bau es so schrittweise auf, von innen nach aussen.

Grüße
Biber
[Edit] Upps, da wurde ich wohl überholt..[/Edit]
Mitglied: ukulele-7
ukulele-7 26.09.2016 um 13:35:38 Uhr
Goto Top
Ja DINSTINCT geht nicht aber GROUP BY macht das selbe und ich habe es auf MSSQL 2014 getestet es geht in Verbindung mit ROW_NUMBER().

Die Spalte braucht einen Namen (bei mir zeile bei Biber m) und der Wert dieser Spalte wird im äußeren Select eingeschränkt.