Ich habe eine bestimmte Anzahl von Zeilen wie folgt:
| Material No | Quantity | Weight | Unit |
--------------------------------------------
| 111-22283/4 | 2 | 53 | kg |
| 123-ABC45/7 | 5 | 41 | g |
| 133-67879/80 | 7 | 31 | g |
| 144-54628 | 1 | 14 | kg |
Jetzt möchte ich eine Ausgabe wie folgt erzeugen:
| Material No | Quantity | Weight | Unit |
--------------------------------------------
| 111-22283 | 2 | 53 | kg |
| 111-22284 | 2 | 53 | kg |
| 123-ABC45 | 5 | 41 | g |
| 123-ABC46 | 5 | 41 | g |
| 123-ABC47 | 5 | 41 | g |
| 133-67879 | 7 | 31 | g |
| 133-67880 | 7 | 31 | g |
| 144-54628 | 1 | 14 | kg |
Logik : Basierend auf dem Material muss ich die Zeilen nicht aufteilen. Wenn '/' am Ende des Materials nein ist, muss es gesplittet werden. Dann müssen wir die Differenz s/w letzte Zahl in der Materialnummer und der Zahl / finden. Wenn ja, dann möchte2
ich 2 verschiedene Zeilen mit jeder Nummer als Materialnummer ( bedeutet, wenn die letzte Ziffer 83/4 ist, dann möchte ich, dass die Materialnummer mit 83 und 84 endet ). Der schwierige Teil ist, wenn wir 89/90 haben. Es enthält 2 Zahlen nach / ( nur für 10er, 20er usw. ). Alle anderen Spalten bleiben für jede Material-Nr. gleich.
Um dies zu erreichen, haben wir derzeit eine sehr große Prozedur, die etwa 50-80 Zeilen Code enthält (finden Sie die Zeile mit '/' und entfernen Sie sie separat, dann suchen Sie den Index von / und so weiter). Ich würde gerne wissen, ob dies mit einer einfachen Abfrage oder einem sehr kurzen Verfahren möglich ist.
Der schwierige Teil ist wahrscheinlich das Aufteilen material no
der starting
und die ending
Zahl.
Danach ist es nur eine einfache rekursive Abfrage, um die Nummer zu erhöhen und wieder zu verketten, um die Materialnummer zu bilden.
;with rcte as
(
select MaterialNo,
base, st, en, n = st,
material = convert(varchar(20), base + isnull(convert(varchar(10), st), ''))
from material m
-- get the position of the `/`
cross apply
(
select split = charindex('/', MaterialNo)
) s
-- extract the ending number and convert to integer
cross apply
(
select en = case when split > 0
then convert(int, right(MaterialNo, len(MaterialNo) - split))
end
) en
-- extract the starting number and convert to integer
cross apply
(
select st = case when split > 0
then convert(int, substring(MaterialNo, split - len(en), len(en)))
end
) st
-- extract the base material no for concatenate
cross apply
(
select base = case when split > 0
then left(MaterialNo, split - len(en) - 1)
else MaterialNo
end
) b
union all
select MaterialNo, base, st, en,
n = n + 1,
material = convert(varchar(20), base + convert(varchar(10), n + 1))
from rcte
where n < en
)
select *
from rcte
order by MaterialNo, material
all dies basiert auf der Annahme, dass die Endung von Material Nr. rein numerisch ist.
Hinweis: Wenn Sie eine Tally-Tabelle haben, können Sie diese verwenden, um das rekursive cte . zu ersetzen
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen