PDA

View Full Version : SQL - eindeutige ID für Satz ?



sim
15-12-04, 11:01
Hallo,

vielleicht kann mir jemand helfen.
Ich führe unten stehenden SQL mit einem GROUP BY aus.

Nun möchte ich zusätzlich noch eine eindeutige ID (zahl, 5,0) für jede Ergebniszeile ausgeben.

Gibts hierfür einen SQL Befehl, Funktion etc... ???
curRow, curId oder so.....?

SELECT
count(*) as anzahl, abrabrtext FROM abrechvgl
join kbeleg on ABRKBEKY = kbelfdnr
where kbewanr = 18800 and kbevnr = 1
group by abrabrtext
order by 1 desc

sim

Markus Reimers
16-12-04, 16:39
Versuchen Sie es doch einmal mit :


SELECT decimal(rrn(abrechvgl),5,0) as rowID, count(*) as anzahl, abrabrtext FROM abrechvgl
join kbeleg on ABRKBEKY = kbelfdnr
where kbewanr = 18800 and kbevnr = 1
group by 1,2
order by 2 desc


RRN(TABLE) : Gibt die Relative Datensatz Nummer aus

Fuerchau
16-12-04, 16:44
Das gibt allerdings einen SQL-Fehler, wenn die RRN > 99999 wird !
Wofür soll diese ID denn gut sein ?

B.Hauser
16-12-04, 20:15
Hallo Sim,

so ganz einfach ist das nicht!
Es gibt keine Funktion, die einfach eingebunden werden kann.
Die relative Satz-Nr. liefert zwar eine eindeutige Kennung, ist jedoch nicht unbedingt fortlaufend.

Das heisst jedoch nicht, dass es nicht möglich ist.
Wenn ich mich mit Deinen Feld- und Datei-Namen nicht verschrieben habe, sollte das folgende SQL-Statement funktionnieren:


with x as (select count(*) as Anz, ABRABRTEXT as Text
from ABRECHVGL a join KBELEG b
on a.ABRKBEKY = KBELFDNR
where KBEWANR = 18800 and KBEVNR = 1
group by ABRABRTEXT),
y as (select Anz as yAnz, Text as yText,
digits(Anz) concat Text as yKey
from x),
z as (select Anz as zAnz, Text as zText,
digits(Anz) concat Text as zKey
from x)
select yAnz, yText, count(zKey) as Zaehler
from y inner join z
on yKey >= zKey
group by yAnz, yText


Vielleicht gibt es ja noch einfachere Lösungen

sim
17-12-04, 06:34
@all
erstmal vielen dank für die hilfe. ich war schon dabei den
umweg über eine temporäre tabelle zu machen.

@Markus Reimers
Das mit der relativen Satznummer hatte ich schon versucht. Funktioniert aber leider nicht.

@Fuerchau
Die ID kennzeichnet alle Kunden einer Gruppe. abrabrtext ist zwar
schon eindeutig aber als varchar feld nicht unbedingt für die weitere verarbeitung zu gebrauchen ;-)

@B.Hauser
dein SQL funktioniert optimal. genau das was ich gebraucht habe.

thx, sim

sim
17-12-04, 06:47
Hallo Birgitta,

eine kurze Erklärung zum SQL wäre nicht schlecht.
danke. sim


Hallo Sim,

so ganz einfach ist das nicht!
Es gibt keine Funktion, die einfach eingebunden werden kann.
Die relative Satz-Nr. liefert zwar eine eindeutige Kennung, ist jedoch nicht unbedingt fortlaufend.

Das heisst jedoch nicht, dass es nicht möglich ist.
Wenn ich mich mit Deinen Feld- und Datei-Namen nicht verschrieben habe, sollte das folgende SQL-Statement funktionnieren:


with x as (select count(*) as Anz, ABRABRTEXT as Text
from ABRECHVGL a join KBELEG b
on a.ABRKBEKY = KBELFDNR
where KBEWANR = 18800 and KBEVNR = 1
group by ABRABRTEXT),
y as (select Anz as yAnz, Text as yText,
digits(Anz) concat Text as yKey
from x),
z as (select Anz as zAnz, Text as zText,
digits(Anz) concat Text as zKey
from x)
select yAnz, yText, count(zKey) as Zaehler
from y inner join z
on yKey >= zKey
group by yAnz, yText


Vielleicht gibt es ja noch einfachere Lösungen

B.Hauser
18-12-04, 12:46
Hallo Birgitta,

eine kurze Erklärung zum SQL wäre nicht schlecht.
danke. sim

Ein komplettes Select-Statement besteht aus zwei Teilen:
1. Common Table Expressions (With ...)
2. Fullselect --> das eigentliche Select-Statement

Common Table Expressions (CTE) ermöglichen einem komplexe SQL-Statements besser zu strukturieren. Mit CTEs können temporäre Views, die nur für dieses eine Select-Statement gelten definiert werden. Wie bei anderen Views können auch diese temporären Views in weiteren temporären Views verwendet werden.

In meinem Beispiel habe ich Dein ursprüngliches Select-Statement als CTE definiert, um das Ergebnis mit neuen Feld-Namen einfacher verwenden zu können.
Anschliessend habe ich aus dieser CTE zwei weitere Views mit dem selben Aufbau und einem zusätzlichen Schlüssel-Feld, das für die folgenden Verknüpfungen erforderlich ist, definiert.

Nun zum eigentlichen Select-Statement. Hier wird die Original-Abfrage mit sich selbst verknüpft. Durch die >= Verknüpfung wird jeweils nur die Anzahl der Zeilen bis zum entsprechenden Schlüssel-Wert ermittelt.

Birgitta

Unregistriert
22-12-04, 11:47
Hallo Sim,

so ganz einfach ist das nicht!
Es gibt keine Funktion, die einfach eingebunden werden kann.
Die relative Satz-Nr. liefert zwar eine eindeutige Kennung, ist jedoch nicht unbedingt fortlaufend.

Das heisst jedoch nicht, dass es nicht möglich ist.
Wenn ich mich mit Deinen Feld- und Datei-Namen nicht verschrieben habe, sollte das folgende SQL-Statement funktionnieren:


with x as (select count(*) as Anz, ABRABRTEXT as Text
from ABRECHVGL a join KBELEG b
on a.ABRKBEKY = KBELFDNR
where KBEWANR = 18800 and KBEVNR = 1
group by ABRABRTEXT),
y as (select Anz as yAnz, Text as yText,
digits(Anz) concat Text as yKey
from x),
z as (select Anz as zAnz, Text as zText,
digits(Anz) concat Text as zKey
from x)
select yAnz, yText, count(zKey) as Zaehler
from y inner join z
on yKey >= zKey
group by yAnz, yText


Vielleicht gibt es ja noch einfachere Lösungen

Hallo Forum,

Der obige "Trick" kam genau zur richtigen Zeit und funktioniert
prima.

ABER: Wenn ich das Ergebnis nicht als Resultset sondern in
eine Tabelle schreiben möchte (also die Zeile "Insert Into lib/File" als erste Zeile der letzten SQL-Anweisung stelle) bekomme ich
die Fehlermeldung "Schlüsselwort INSERT nicht erwartet. Gültige Token: ( SELECT.

Was mache ich falsch?

Danke schon mal für die Mühen.

B.Hauser
22-12-04, 18:25
Hallo Forum,

Der obige "Trick" kam genau zur richtigen Zeit und funktioniert
prima.

ABER: Wenn ich das Ergebnis nicht als Resultset sondern in
eine Tabelle schreiben möchte (also die Zeile "Insert Into lib/File" als erste Zeile der letzten SQL-Anweisung stelle) bekomme ich
die Fehlermeldung "Schlüsselwort INSERT nicht erwartet. Gültige Token: ( SELECT.

Was mache ich falsch?

Danke schon mal für die Mühen.

Commont Table Expressions gehören zum SELECT statement und zu keinem anderen Statement.
Ein vollständiges SELECT-Statement besteht aus Common Table Expressions und einem Full-Select.

Wenn Du also Sätze in eine bestehende Datei einfügen willst,
musst du das komplette Select-Statement (mit allen CTEs) innerhalb des Inserts angeben:

Beispiel:


insert into MySchema/MyTable
with x as (select count(*) as Anz, ABRABRTEXT as Text
from ABRECHVGL a join KBELEG b
on a.ABRKBEKY = KBELFDNR
where KBEWANR = 18800 and KBEVNR = 1
group by ABRABRTEXT),
y as (select Anz as yAnz, Text as yText,
digits(Anz) concat Text as yKey
from x),
z as (select Anz as zAnz, Text as zText,
digits(Anz) concat Text as zKey
from x)
select yAnz, yText, count(zKey) as Zaehler
from y inner join z
on yKey >= zKey
group by yAnz, yText


Birgitta

Unregistriert
23-12-04, 09:48
Commont Table Expressions gehören zum SELECT statement und zu keinem anderen Statement.
Ein vollständiges SELECT-Statement besteht aus Common Table Expressions und einem Full-Select.

Wenn Du also Sätze in eine bestehende Datei einfügen willst,
musst du das komplette Select-Statement (mit allen CTEs) innerhalb des Inserts angeben:

Beispiel:


insert into MySchema/MyTable
with x as (select count(*) as Anz, ABRABRTEXT as Text
from ABRECHVGL a join KBELEG b
on a.ABRKBEKY = KBELFDNR
where KBEWANR = 18800 and KBEVNR = 1
group by ABRABRTEXT),
y as (select Anz as yAnz, Text as yText,
digits(Anz) concat Text as yKey
from x),
z as (select Anz as zAnz, Text as zText,
digits(Anz) concat Text as zKey
from x)
select yAnz, yText, count(zKey) as Zaehler
from y inner join z
on yKey >= zKey
group by yAnz, yText


Birgitta

Vielen Dank, hat mich wieder ein großes Stück weiter gebracht.