View Full Version : SQL Auswertung 5 Felder im Datensatz ...suche nach identischem Inhalt
Hallo zusammen,
ich habe in einem Kundenstamm 5 Felder, je 3A, in denen ein 3-stelliger Schlüssel steht, dieser
representiert den zuständigen Sachbearbeiter für den jeweiligen Kunden.
Nach einer Neuorganisation der Schlüssel habe ich jetzt bei einigen Kunden Schlüssel mehrfach in den 5 Feldern.
Kennt jemand eine galante SQL Lösung für die Ermittlung solcher Kunden ????
Ich kann natürlich alle 5 Felder gegeneinander auf gleichen Inhalt prüfen, viel Code ...
Vielleicht gibt es ja eine bessere Lösung.
Vielen Dank im Voraus.
Peet
Im Prinzip "unpivot":
select * from (
select Kunde, SB1 as SB, 'SB1' as Feld from Tabelle
union
select Kunde, SB2, 'SB2' as Feld from Tabelle
:
) k
where SB ...
Im Prinzip "unpivot":
select * from (
select Kunde, SB1 as SB, 'SB1' as Feld from Tabelle
union
select Kunde, SB2, 'SB2' as Feld from Tabelle
:
) k
where SB ...
Danke, das ist natürlich eine Idee...ich baue das mal zusammen.
Vg.
Hier eine Variante die die Duplikate entfernt und die Daten wieder in der originalform bereitstellt:
<style>body { font-family:Monospaced; font-size:17px; }</style><style class="darkreader darkreader--sync" media="screen"></style>with
kunden(kdnr, knz1, knz2, knz3, knz4, knz5) as (
values
(1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE'),
(2, 'AAA', 'BBB', 'BBB', 'CCC', 'DDD')
),
unpivot as (
select distinct
kdnr, knz, dense_rank() over(partition by kdnr order by knz) as knznr
from
kunden
cross join lateral(
values (knz1), (knz2), (knz3), (knz4), (knz5)
) as dt(knz)
)
select
kdnr,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 1), '') as knz1,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 2), '') as knz2,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 3), '') as knz3,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 4), '') as knz4,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 5), '') as knz5
from
kunden
Wow, vielen Dank !
Vg.
Hier eine Variante die die Duplikate entfernt und die Daten wieder in der originalform bereitstellt:
<style>body { font-family:Monospaced; font-size:17px; }</style><style class="darkreader darkreader--sync" media="screen"></style>with
kunden(kdnr, knz1, knz2, knz3, knz4, knz5) as (
values
(1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE'),
(2, 'AAA', 'BBB', 'BBB', 'CCC', 'DDD')
),
unpivot as (
select distinct
kdnr, knz, dense_rank() over(partition by kdnr order by knz) as knznr
from
kunden
cross join lateral(
values (knz1), (knz2), (knz3), (knz4), (knz5)
) as dt(knz)
)
select
kdnr,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 1), '') as knz1,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 2), '') as knz2,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 3), '') as knz3,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 4), '') as knz4,
ifnull((select knz from unpivot where unpivot.kdnr = kunden.kdnr and knznr = 5), '') as knz5
from
kunden
Man kann das Ganze noch um einige Sub-Selects reduzieren:
with
kunden(kdnr, knz1, knz2, knz3, knz4, knz5) as (
values
(1, 'AAA', 'BBB', 'CCC', 'DDD', 'EEE'),
(2, 'AAA', 'BBB', 'BBB', 'CCC', 'DDD')
),
unpivot as (
select distinct
kdnr, knz, dense_rank() over(partition by kdnr order by knz) as knznr
from
kunden
cross join lateral(
values (knz1), (knz2), (knz3), (knz4), (knz5)
) as dt(knz)
)
select KDNR, Coalesce(Min(Case When knzNr = 1 Then KNZ End), '') as KNZ1,
Coalesce(Min(Case When knzNr = 2 Then KNZ End), '') as KNZ2,
Coalesce(Min(Case When KnzNr = 3 Then KNZ End), '') as KNZ3,
Coalesce(Min(Case When KnzNr = 4 Then KNZ End), '') as KNZ4,
Coalesce(Min(Case When KnzNr = 5 Then KNZ End), '') as KNZ5
From Unpivot
Group by KdNr;
Der cross join lateral reicht ja schon.
Der nachfolgende Selekt bringt die Felder ja wieder nebenenander.
Die Funktion Values mit Komma mehrere Zeilen zu erstellen hatte ich nicht mehr auf dem Schirm.
Das liegt auch daran, dass dies nicht in jedem Dialekt (SQL-Server, Oracle, Firebird, ...) unterstützt wird.
Das spart den Union.