solardub
Goto Top

ROW-NUMBER über UNION Select

MSSQL 2008:
Ich hatte vorher eine Abfrage, nun brauche ich zwei Select's die mit UNION gemeinsam abgefragt werden.

Dazu verwendete ich im Select auch Row_Number um eine fortlaufende Nummer zu bekommen.
Diese Nummer brauch ich als eindeutige Zahl für ID und BSNR

Leider beginnt die Nummerierung ab dem zweiten Select wieder am Anfang.

SET @bsnr = @monat+RIGHT(@Jahr,2)+'0000'
select
CAST((@BSNR+(ROW_NUMBER() over(order by GLN))) AS CHAR(7))+(SUBSTRING((RIGHT(@Jahr,2)), 1, 2)) AS ID
,(@BSNR+(ROW_NUMBER() over(order by GLN))) AS BSNR
, Artikelnummer
, Menge
, GLN
from view_BSMenge
where KZ='A'

UNION

select
CAST((@BSNR+(ROW_NUMBER() over(order by GLN))) AS CHAR(7))+(SUBSTRING((RIGHT(@Jahr,2)), 1, 2)) AS ID
,(@BSNR+(ROW_NUMBER() over(order by GLN))) AS BSNR
, Artikelnummer
, Menge
, GLN
from view_BSMenge
where KZ='Z'

Hat jemand eine Idee wie ich die Nummerierung über beide Abfragen fortlaufend bekommen kann??

THX, Solardub

Content-Key: 415688

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

Printed on: April 24, 2024 at 07:04 o'clock

Member: akretschmer
akretschmer Feb 08, 2019 updated at 15:39:18 (UTC)
Goto Top
sicher.


test=*# select 'q1'||s::text from generate_series(1,6) s union all select 'q2'||s::text from generate_series(1,8) s; 
 ?column? 
----------
 q11
 q12
 q13
 q14
 q15
 q16
 q21
 q22
 q23
 q24
 q25
 q26
 q27
 q28
(14 rows)

test=*# select *, row_number() over() from (select 'q1'||s::text from generate_series(1,6) s union all select 'q2'||s::text from generate_series(1,8) s) bla; 
 ?column? | row_number 
----------+------------
 q11      |          1
 q12      |          2
 q13      |          3
 q14      |          4
 q15      |          5
 q16      |          6
 q21      |          7
 q22      |          8
 q23      |          9
 q24      |         10
 q25      |         11
 q26      |         12
 q27      |         13
 q28      |         14
(14 rows)

test=*#
Member: MadMax
MadMax Feb 08, 2019 at 16:27:58 (UTC)
Goto Top
Seltsame Begrüßung, aber Dir auch ein freundliches MSSQL 2008:,

Du brauchst gar kein union, die Abfragen sind ja gleich, bis auf die Kennzeichen. Reicht also, wenn Du Deine Bedingung anpaßt:
select
CAST((@BSNR+(ROW_NUMBER() over(order by GLN))) AS CHAR(7))+(SUBSTRING((RIGHT(@Jahr,2)), 1, 2)) AS ID
,(@BSNR+(ROW_NUMBER() over(order by GLN))) AS BSNR
, Artikelnummer
, Menge
, GLN
from view_BSMenge
where KZ in ('A', 'Z')

Gruß, Mad Max
Member: Solardub
Solardub Feb 11, 2019 at 07:54:21 (UTC)
Goto Top
Hi Mad Max!

Ups, da hab ich wohl die Begrüßung übersehen, aber hier nochmal ein offizielles "Hallo" an alle face-wink

Die zwei Select's wurden doch noch um einiges erweitert und die Bedingungen unterscheiden sich nun komplett, aber von der Struktur bleiben Sie gleich, somit kann ich es mit UNION verbinden.
Member: Solardub
Solardub Feb 11, 2019 updated at 07:58:27 (UTC)
Goto Top
@akretschmer
ok, sieht komplex aus, aber werde ich gleich mal testen!
Member: MadMax
Solution MadMax Feb 11, 2019 at 18:38:09 (UTC)
Goto Top
Moin Solardub,

Du kannst Deine komplette Abfrage mit einer Klammer umschließen und dann in der From-Klausel wie eine Tabelle nutzen. Wichtig ist noch, daß Du Deiner neuen "Tabelle" noch einen Namen gibst, hier habe ich es einfach mal t genannt.
Die ID kannst Du bei den Einzelabfragen dann weglassen, oder mit in die endgültige ID verwursten.

SET @BSNR = @Monat+RIGHT(@Jahr,2)+'0000'  

select	row_number () over (order by irgendwas) as ID_Gesamt, *	
from	(select
	CAST((@BSNR+(ROW_NUMBER() over(order by GLN))) AS CHAR(7))+(SUBSTRING((RIGHT(@Jahr,2)), 1, 2)) AS ID
	,(@BSNR+(ROW_NUMBER() over(order by GLN))) AS BSNR
	, Artikelnummer
	, Menge
	, GLN
	from view_BSMenge
	where KZ='A'  
	
	UNION
	
	select
	CAST((@BSNR+(ROW_NUMBER() over(order by GLN))) AS CHAR(7))+(SUBSTRING((RIGHT(@Jahr,2)), 1, 2)) AS ID
	,(@BSNR+(ROW_NUMBER() over(order by GLN))) AS BSNR
	, Artikelnummer
	, Menge
	, GLN
	from view_BSMenge
	where KZ='Z') t  

Gruß, Mad Max
Member: Solardub
Solardub Feb 12, 2019 at 14:13:14 (UTC)
Goto Top
Danke, Mad Max!

Habe einfach meine ersten beiden Zeilen in den ersten Select hochkopiert und funktioniert wunderbar.

Select CAST((@BSNR+(ROW_NUMBER() over(order by lm_kst))) AS CHAR(8))+(SUBSTRING((RIGHT(@Jahr,2)), 1, 2)) AS ID,
(@BSNR+(ROW_NUMBER() over(order by lm_kst))) AS BSNR, *
From (select
, Artikelnummer
......
......) t