 |
Softpicks.Net Deutsch Software Forum Deutsch
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
Jens Süßmeyer
Anmeldedatum: 01.01.1970 Beiträge: 185
|
Verfasst am: Di Sep 02, 2003 9:03 pm Titel: case Abfrage |
|
|
ohne DDL und Beispieldaten ist es nicht sehr schön die Abfrage zu lesen.
Mein Tipp: Einfach mal oben genanntes reinstellen, dann werden wir uns schon
draufstürzen )
HTH, Jens Süßmeyer.
"Richard Sedellke" <sedellke [at] wtal.de> schrieb im Newsbeitrag
news:019301c37183$37d7a640$a501280a [at] phx.gbl...
Warum erhalte ich hier beide Datensätze 'privat' und 'alte
Adresse'? Ich habe geglaubt, die Abfrage liefert mir nur
eine von beiden, wenn privat vorhanden dann privat, sonst
alte Adresse.
Wer kann helfen?
Gruß, richard
SELECT m.idMitarbeiter, m.dtNachname, m.dtVorname,
a.dtAdresstyp,
CASE WHEN
(a.dtGueltigBis >= getdate() OR
a.dtGueltigBis IS NULL) AND
(a.dtGueltigAb <= getdate() OR
a.dtGueltigAb IS NULL and
m.idMitarbeiter = a.fiMitarbeiter)
THEN
(SELECT TOP 1 dtStrasse
+ ' ' + dtHausNr + ', ' + dtPlz + ' ' + dtOrt
FROM dbo.tdtaAdresse a
WHERE a.fiMitarbeiter =
m.idMitarbeiter AND a.dtAdressTyp = 'privat')
ELSE
(SELECT TOP 1 dtStrasse
+ ' ' + dtHausNr + ', ' + dtPlz + ' ' + dtOrt
FROM dbo.tdtaAdresse a
WHERE a.fiMitarbeiter =
m.idMitarbeiter AND a.dtAdressTyp = 'Alte Adresse')
END AS Adresse, m.dtStatus
....
.
|
|
| Nach oben |
|
 |
Christoph Muthmann
Anmeldedatum: 01.01.1970 Beiträge: 899
|
Verfasst am: Mi Sep 03, 2003 8:32 am Titel: case Abfrage |
|
|
Uwe Müller wrote:
> Hi Richard,
>
> wieso erwartest du eine Selection auf die Records, wenn du keine
> where-klausel hast, dein case bezieht sich doch nur auf die Ausgabe
> der 5.Spalte oder ??
Genau so sehe ich das auch! Das Case muß zur Not in die Join oder
Where-Klausel eingebaut werden.
Einen schönen Tag noch,
Christoph
--
(Please post ALL replies to the newsgroup only unless indicated otherwise)
.
|
|
| Nach oben |
|
 |
Rainer Schwenkreis
Anmeldedatum: 01.01.1970 Beiträge: 7
|
Verfasst am: Mi Sep 03, 2003 11:54 am Titel: case Abfrage |
|
|
Hallo Richard,
wenn du NUR eine Lösung willst dann schreib distinct nach dem Select.
Also SELECT DISTINCT ...
Das sollte das gewünschte Ergebnis liefern.
Alternativ geht auch
SELECT TOP 1
Gruß Rainer
.
|
|
| Nach oben |
|
 |
Christoph Muthmann
Anmeldedatum: 01.01.1970 Beiträge: 899
|
Verfasst am: Mi Sep 03, 2003 3:29 pm Titel: case Abfrage |
|
|
Richard Sedellke wrote:
> [Details gesnippt]
> Dein Tipp:
> SELECT m.idMitarbeiter, m.dtNachname, m.dtVorname,
> a.dtAdresstyp,
> Coalesce (a.dtStrasse, a.dtHausNr, a.dtPlz, a.dtOrt) as
> Adresse
> from dbo.Mitarbeiter m
> left join
> dbo.Adressen a on a.fiMitarbeiter = m.idMitarbeiter and
> a.dtAdressTyp = 'privat'
> left join
> dbo.Adressen on a.fiMitarbeiter = m.idMitarbeiter and
> a.dtAdressTyp = 'Alte Adresse'
Hallo Richard,
mein Tipp sah etwas anders aus.
Die Tabelle Adressen bekommt zwei verschiedene Alias-Namen (a und b).
Über Coalesce ermittelst Du das erste Feld, was nicht Null war:
Coalesce(a.dtStrasse, b.dtStrasse)
bzw. Coalesce(a.dtStrasse+a.dtHausNr+ a.dtPlz+ a.dtOrt,
b.dtStrasse+b.dtHausNr+b.dtPlz+b.dtOrt)
Beachte aber bitte die Besonderheiten bei Stringverkettungen mit einem evtl.
vorhandenen Null-Wert. Falls also der Ort NULL ist, wird die ganze Kette
Null.
Einen schönen Tag noch,
Christoph
--
(Please post ALL replies to the newsgroup only unless indicated otherwise)
.
|
|
| Nach oben |
|
 |
Jens Süßmeyer
Anmeldedatum: 01.01.1970 Beiträge: 185
|
Verfasst am: Mi Sep 03, 2003 5:42 pm Titel: case Abfrage |
|
|
Wenn Du hier schon die Datensätze postest, dann kannst Du doch auch die
DDL und Examples schicken, das macht das ganze einfacher zum
nachvollziehen..
Jens Süßmeyer.
"richard sedellke" <sedellke [at] wtal.de> schrieb im Newsbeitrag
news:072801c3722c$fac57d40$a001280a [at] phx.gbl...
hallo Christoph,
ich bin Deinem Rat gefolgt.
Das Statement :
SELECT m.idMitarbeiter, m.dtNachname, m.dtVorname,
a.dtAdresstyp,
Coalesce(a.dtStrasse+a.dtHausNr+ a.dtPlz+ a.dtOrt,
b.dtStrasse+b.dtHausNr+b.dtPlz+b.dtOrt) as Adresse
from dbo.Mitarbeiter m
left join dbo.Adressen a on a.fiMitarbeiter =
m.idMitarbeiter and a.dtAdressTyp = 'Alte Adresse'
left join dbo.Adressen b on a.fiMitarbeiter =
m.idMitarbeiter and a.dtAdressTyp = 'privat'
order by m.dtNachname
liefert mirfolgendes Ergebnis:
15376 Aretz Dieter NULL NULL
15387 Baba Hichem Alte Adresse Strasse21353117Bonn
15395 Baier Ute Alte Adresse
Strasse2876185Karlsruhe
15440 Bollen Peter Alte Adresse NULL
15443 Bork Peter NULL NULL
15461 Brinkmann Ute-Susanne Alte Adresse
Strasse11642329Wuppertal
15480 Conrad Cornelia NULL NULL
15492 Danko Elisabeth NULL NULL
15353 Edgar Peter NULL NULL
15424 Maaß Eva Alte Adresse Strasse1153111Bonn
Es sind die richtigen Datensätze aber entweder ohne die
oder auch die Andere Adresse. Je nach Reihenfolge der Join.
Danke Dir aber schon jetzt für Dein Engagement.
richard
>Hallo Richard,
>mein Tipp sah etwas anders aus.
>
>Die Tabelle Adressen bekommt zwei verschiedene Alias-
Namen (a und b).
>Über Coalesce ermittelst Du das erste Feld, was nicht
Null war:
>Coalesce(a.dtStrasse, b.dtStrasse)
>bzw. Coalesce(a.dtStrasse+a.dtHausNr+ a.dtPlz+ a.dtOrt,
>b.dtStrasse+b.dtHausNr+b.dtPlz+b.dtOrt)
>
>Beachte aber bitte die Besonderheiten bei
Stringverkettungen mit einem evtl.
>vorhandenen Null-Wert. Falls also der Ort NULL ist, wird
die ganze Kette
>Null.
>
>Einen schönen Tag noch,
>Christoph
>--
>(Please post ALL replies to the newsgroup only unless
indicated otherwise)
>
>
>.
>
.
|
|
| Nach oben |
|
 |
Richard Sedellke
Anmeldedatum: 01.01.1970 Beiträge: 20
|
Verfasst am: Mi Sep 03, 2003 5:52 pm Titel: case Abfrage |
|
|
Die Beispieldatensätze stehen doch zwei Einträge höher bereits drin, siehe
Eintrag von 14:49 Uhr
"Jens Süßmeyer" <jsuessmeyer [at] [REJECT_SPAM]web.de> schrieb im Newsbeitrag
news:eAnYEIjcDHA.1808 [at] TK2MSFTNGP11.phx.gbl...
> Wenn Du hier schon die Datensätze postest, dann kannst Du doch auch die
> DDL und Examples schicken, das macht das ganze einfacher zum
> nachvollziehen..
>
> Jens Süßmeyer.
>
>
.
|
|
| Nach oben |
|
 |
Christoph Muthmann
Anmeldedatum: 01.01.1970 Beiträge: 899
|
Verfasst am: Do Sep 04, 2003 11:45 am Titel: case Abfrage |
|
|
Jens Süßmeyer wrote:
> Ich weiß nicht wie Du das hälst aber ich kann das ganze immernoch am
> besten ausprobieren, wenn ich meinen eigenen SQL Server verwenden
> kann. Also meinte ich mit Beispieldatensätze mit INSERT Anweisungen.
>
Hallo Jens,
ich habe das mal übernommen und auch die kleinen Fehler im Select beseitigt.
Zusätzlich habe ich die Einschränkung für die jeweils erste gefundene
Adresse eingebaut. HTH!
Set Nocount On
create table Adressen (idAdresse int, fiMitarbeiter int, dtStrasse
varchar(100), dtAdresstyp varchar(100))
create table Mitarbeiter(idMitarbeiter int, dtNachname varchar(100),
dtVorname varchar(100))
go
insert into Adressen values(1671, 15424 ,'Strasse2', 'Privat')
insert into Adressen values(1697, 15424 ,'Strasse1', 'Alte Adresse')
insert into Adressen values(1021, 15443 ,'Strasse1', 'Privat')
insert into Adressen values(2230, 15443 ,'Strasse2', 'Privat')
insert into Adressen values(1050, 15480 ,'Strasse1', 'Privat')
insert into Adressen values(1060, 15492 ,'Strasse1', 'Privat')
insert into Adressen values(973, 15376 ,'Strasse1', 'Privat')
insert into Adressen values(1033, 15461 ,'Strasse1', 'Alte Adresse')
insert into Adressen values(1721, 15461 ,'Strasse2', 'Privat')
insert into Adressen values(1018, 15440 ,'Strasse2', 'Alte Adresse')
insert into Adressen values(986, 15395 ,'Strasse2', 'Alte Adresse')
insert into Adressen values(2432, 15387 ,'Strasse2', 'Alte Adresse')
go
insert into Mitarbeiter values(15353 ,'Edgar', 'Peter')
insert into Mitarbeiter values(15376 ,'Aretz', 'Dieter')
insert into Mitarbeiter values(15387 ,'Baba', 'Hichem')
insert into Mitarbeiter values(15395 ,'Baier', 'Ute')
insert into Mitarbeiter values(15424 ,'Maaß', 'Eva')
insert into Mitarbeiter values(15440 ,'Bollen', 'Peter')
insert into Mitarbeiter values(15443 ,'Bork', 'Peter')
insert into Mitarbeiter values(15461 ,'Brinkmann', 'Ute-Susanne')
insert into Mitarbeiter values(15480 ,'Conrad', 'Cornelia')
insert into Mitarbeiter values(15492 ,'Danko', 'Elisabeth')
go
select * from Mitarbeiter order by idMitarbeiter
select * from Adressen order by fiMitarbeiter
SELECT m.idMitarbeiter, m.dtNachname, m.dtVorname,
coalesce(a.dtAdresstyp, b.dtAdresstyp) as Adresstyp, -- hier gefüllten
Adresstyp angeben
Coalesce(a.dtStrasse,b.dtStrasse) as Adresse
from dbo.Mitarbeiter m
left join dbo.Adressen a on a.fiMitarbeiter =
m.idMitarbeiter and a.dtAdressTyp = 'Alte Adresse'
and a.idAdresse in -- nur erste Adresse verwenden
(select top 1 idAdresse from Adressen c
where c.fiMitarbeiter = a.fiMitarbeiter
and a.dtAdressTyp = 'Alte Adresse')
left join dbo.Adressen b on b.fiMitarbeiter = -- erster Fehler; war
a.fiMitarbeiter
m.idMitarbeiter and b.dtAdressTyp = 'Privat' -- zweiter Fehler; war
a.dtAdressTyp
and b.idAdresse in -- nur erste Adresse verwenden
(select top 1 idAdresse from Adressen c
where c.fiMitarbeiter = b.fiMitarbeiter
and c.dtAdressTyp = 'Privat')
where coalesce(a.dtAdresstyp, b.dtAdresstyp) is not null-- nur mit Adressen
ausgeben
order by m.idMitarbeiter
go
drop table Adressen
drop table Mitarbeiter
--
Einen schönen Tag noch,
Christoph
--
(Please post ALL replies to the newsgroup only unless indicated otherwise)
.
|
|
| Nach oben |
|
 |
Richard Sedellke
Anmeldedatum: 01.01.1970 Beiträge: 20
|
Verfasst am: Do Sep 04, 2003 12:23 pm Titel: case Abfrage |
|
|
Hallo Christoph,
DANKE!
Ich bin noch nicht ganz dahinter gekommen was da passiert, aber ich lerne ja
auch noch.
sonnige Grüße aus Düsseldorf
"Christoph Muthmann" <c.muthmann [at] gmx.de> schrieb im Newsbeitrag
news:ul4WalscDHA.2436 [at] TK2MSFTNGP09.phx.gbl...
> Jens Süßmeyer wrote:
> > Ich weiß nicht wie Du das hälst aber ich kann das ganze immernoch am
> > besten ausprobieren, wenn ich meinen eigenen SQL Server verwenden
> > kann. Also meinte ich mit Beispieldatensätze mit INSERT Anweisungen.
> >
> Hallo Jens,
> ich habe das mal übernommen und auch die kleinen Fehler im Select
beseitigt.
> Zusätzlich habe ich die Einschränkung für die jeweils erste gefundene
> Adresse eingebaut. HTH!
>
> Set Nocount On
> create table Adressen (idAdresse int, fiMitarbeiter int, dtStrasse
> varchar(100), dtAdresstyp varchar(100))
> create table Mitarbeiter(idMitarbeiter int, dtNachname varchar(100),
> dtVorname varchar(100))
> go
> insert into Adressen values(1671, 15424 ,'Strasse2', 'Privat')
> insert into Adressen values(1697, 15424 ,'Strasse1', 'Alte Adresse')
> insert into Adressen values(1021, 15443 ,'Strasse1', 'Privat')
> insert into Adressen values(2230, 15443 ,'Strasse2', 'Privat')
> insert into Adressen values(1050, 15480 ,'Strasse1', 'Privat')
> insert into Adressen values(1060, 15492 ,'Strasse1', 'Privat')
> insert into Adressen values(973, 15376 ,'Strasse1', 'Privat')
> insert into Adressen values(1033, 15461 ,'Strasse1', 'Alte Adresse')
> insert into Adressen values(1721, 15461 ,'Strasse2', 'Privat')
> insert into Adressen values(1018, 15440 ,'Strasse2', 'Alte Adresse')
> insert into Adressen values(986, 15395 ,'Strasse2', 'Alte Adresse')
> insert into Adressen values(2432, 15387 ,'Strasse2', 'Alte Adresse')
> go
> insert into Mitarbeiter values(15353 ,'Edgar', 'Peter')
> insert into Mitarbeiter values(15376 ,'Aretz', 'Dieter')
> insert into Mitarbeiter values(15387 ,'Baba', 'Hichem')
> insert into Mitarbeiter values(15395 ,'Baier', 'Ute')
> insert into Mitarbeiter values(15424 ,'Maaß', 'Eva')
> insert into Mitarbeiter values(15440 ,'Bollen', 'Peter')
> insert into Mitarbeiter values(15443 ,'Bork', 'Peter')
> insert into Mitarbeiter values(15461 ,'Brinkmann', 'Ute-Susanne')
> insert into Mitarbeiter values(15480 ,'Conrad', 'Cornelia')
> insert into Mitarbeiter values(15492 ,'Danko', 'Elisabeth')
> go
>
> select * from Mitarbeiter order by idMitarbeiter
> select * from Adressen order by fiMitarbeiter
>
> SELECT m.idMitarbeiter, m.dtNachname, m.dtVorname,
> coalesce(a.dtAdresstyp, b.dtAdresstyp) as Adresstyp, -- hier gefüllten
> Adresstyp angeben
> Coalesce(a.dtStrasse,b.dtStrasse) as Adresse
> from dbo.Mitarbeiter m
> left join dbo.Adressen a on a.fiMitarbeiter =
> m.idMitarbeiter and a.dtAdressTyp = 'Alte Adresse'
> and a.idAdresse in -- nur erste Adresse verwenden
> (select top 1 idAdresse from Adressen c
> where c.fiMitarbeiter = a.fiMitarbeiter
> and a.dtAdressTyp = 'Alte Adresse')
> left join dbo.Adressen b on b.fiMitarbeiter = -- erster Fehler; war
> a.fiMitarbeiter
> m.idMitarbeiter and b.dtAdressTyp = 'Privat' -- zweiter Fehler; war
> a.dtAdressTyp
> and b.idAdresse in -- nur erste Adresse verwenden
> (select top 1 idAdresse from Adressen c
> where c.fiMitarbeiter = b.fiMitarbeiter
> and c.dtAdressTyp = 'Privat')
> where coalesce(a.dtAdresstyp, b.dtAdresstyp) is not null-- nur mit
Adressen
> ausgeben
> order by m.idMitarbeiter
>
> go
> drop table Adressen
> drop table Mitarbeiter
>
>
> --
> Einen schönen Tag noch,
> Christoph
> --
> (Please post ALL replies to the newsgroup only unless indicated otherwise)
>
>
.
|
|
| Nach oben |
|
 |
Christoph Muthmann
Anmeldedatum: 01.01.1970 Beiträge: 899
|
Verfasst am: Do Sep 04, 2003 1:18 pm Titel: case Abfrage |
|
|
richard sedellke wrote:
> Hallo Christoph,
>
> DANKE!
>
> Ich bin noch nicht ganz dahinter gekommen was da passiert, aber ich
> lerne ja auch noch.
>
> sonnige Grüße aus Düsseldorf
Einfach mal die von mir kommentierten Bausteine anschauen und zu verstehen
versuchen. Das kommt dann schon.
Aus meinem Fenster sehe ich allerdings ein paar Wolken auf der anderen
Rheinseite!
Einen schönen Tag noch,
Christoph
--
(Please post ALL replies to the newsgroup only unless indicated otherwise)
.
|
|
| Nach oben |
|
 |
Richard Sedellke
Anmeldedatum: 01.01.1970 Beiträge: 20
|
Verfasst am: Do Sep 04, 2003 7:05 pm Titel: case Abfrage |
|
|
....Du sitzt scheinbar auf der falschen Seite. hier scheint noch immer die
Sonne. ;)
Noch einmal danke. Die Abfrage steht.
cu
"Christoph Muthmann" <c.muthmann [at] gmx.de> schrieb im Newsbeitrag
news:%230XnHZtcDHA.652 [at] tk2msftngp13.phx.gbl...
> richard sedellke wrote:
> > Hallo Christoph,
> >
> > DANKE!
> >
> > Ich bin noch nicht ganz dahinter gekommen was da passiert, aber ich
> > lerne ja auch noch.
> >
> > sonnige Grüße aus Düsseldorf
>
> Einfach mal die von mir kommentierten Bausteine anschauen und zu verstehen
> versuchen. Das kommt dann schon.
>
> Aus meinem Fenster sehe ich allerdings ein paar Wolken auf der anderen
> Rheinseite!
>
> Einen schönen Tag noch,
> Christoph
> --
> (Please post ALL replies to the newsgroup only unless indicated otherwise)
>
>
.
|
|
| Nach oben |
|
 |
Richard Sedellke
Anmeldedatum: 01.01.1970 Beiträge: 20
|
Verfasst am: Fr Sep 05, 2003 11:21 am Titel: case Abfrage |
|
|
Hallo Dieter,
das war ebenfalls ein genialer Tipp und für mich auch leichter zu verstehen.
Danke
richard
"Dieter Noeth" <dnoeth [at] gmx.de> schrieb im Newsbeitrag
news:ueFXe4xcDHA.1880 [at] TK2MSFTNGP10.phx.gbl...
> Christoph Muthmann wrote:
>
> > Zusätzlich habe ich die Einschränkung für die jeweils erste gefundene
> > Adresse eingebaut. HTH!
>
> Ich komm ja etwas spät, aber das kannst du auch einfacher haben:
>
> SELECT m.idMitarbeiter, m.dtNachname, m.dtVorname,
> a.dtAdresstyp,
> a.dtStrasse
> from dbo.Mitarbeiter m
> join dbo.Adressen a on a.fiMitarbeiter = m.idMitarbeiter
> where a.idAdresse in -- nur erste Adresse verwenden
> (
> select top 1 idAdresse from Adressen c
> where c.fiMitarbeiter = a.fiMitarbeiter
> order by fiMitarbeiter,
> case when dtAdressTyp = 'Privat' then 0
> when dtAdressTyp = 'Alte Adresse' then 1
> else 2 end
> )
> and dtAdressTyp in ('Privat', 'Alte Adresse')
> order by m.idMitarbeiter
>
> Es wäre allerdings einfacher bei nur einer Adresse je Adresstyp...
>
> Dieter
>
.
|
|
| Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht teilnehmen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|