2017-01-18 9 views
-1

Ich habe eine Anforderung, wo ich alle Spalten von der Tabelle CLIENT und nur die Telefonnummer aus der Tabelle CLIPHONE ziehen möchte. Für die Telefonnummer haben einige Clients mehrere Telefonnummern, die in CLIPHONE aufgelistet sind, aber ich möchte nur eine Telefonnummer. Also, wenn ein Client ihre "Zelle" oder "Handy" in der Beschreibung aufgeführt hat, dann möchte ich die Nummer mit dem kleinsten Sequenzwert. Wenn die Zelle oder Handy nicht aufgeführt ist, dann möchte ich die eingestellte Sequenz 1sql Abfrage FULL OUTER, CASE WHEN in WHERE

Beispiel: in CLIPHONE

Joey A - clientid = 25, sourceloc = 1, phone = 1234567890, Beschreibung = home, sequence = 1

Joey A - clientid = 25, sourceloc = 1, phone = 0987654321, description = Zelle, sequence = 2

Joey A - clientid = 25, sourceloc = 1, phone = 1111111111, description = mobile, sequence = 3

Dann, wenn ich die Abfrage ausführen Ich möchte, dass die Telefonnummer 0987654321 mit den Spalten von CLIENT angezeigt wird, da sie das Wort "cell" enthält und eine niedrigere Sequenz als die Sequenz 3 mit "mobile" enthält. Wenn Telefon mit Sequenz # 2 das Wort Büro in der Beschreibung hatte, dann würde ich Sequenz 3 im Abfrageergebnis angezeigt bekommen, weil das jetzt das niedrigste mit dem Wort 'Zelle' oder 'Mobil' drin ist

Wenn beide Sequenz 2 und 3 wurden in "Andere" geändert, dann würde ich wollen, dass die Sequenz 1 auftaucht, weil keine andere Sequenz "Zelle" oder "Mobil" hat.

Mit meiner Anfrage erhalte ich diesen Fehler: Msg 147, Ebene 15, Status 1, Zeile 5 Ein Aggregat kann nicht in der WHERE-Klausel erscheinen, wenn es in einer Unterabfrage in einer HAVING-Klausel oder eine Auswahlliste enthalten ist und die aggregierte Spalte ist eine äußere Referenz.

SELECT DISTINCT TOP 1000 cp.phone, c.* 
FROM CLIENT C 
FULL OUTER JOIN CLIPHONE CP 
ON c.clientid = cp.clientid AND c.sourceloc = cp.sourceloc 
WHERE cp.sequence = CASE WHEN (description LIKE '%mobile%' OR description LIKE '%cell%') THEN min(sequence) ELSE 1 END 
ORDER BY sourceloc, clientid 

Hier sind meine Tabellen:

CLIPHONE

CLIENT

+0

Bitte geben Sie die Schemata der beteiligten Tabellen an. Danke –

+2

Beispieldaten und gewünschte Ergebnisse würden wirklich helfen zu vermitteln, was Sie versuchen zu tun. –

+0

@Joey - alle Ihre Antworten müssen in Form einer Frage sein. Was ist los? Was würdest du gerne erleben? – Malvolio

Antwort

0
with phones as (
    select *, 
     row_number over (
      partition by cp.clientid 
      order by 
       case when cp.description in ('cell', 'mobile') then 1 else 2 end, 
       cp.sequence 
     ) as rnk 
    from CLIENT c inner join CLIPHONE cp 
     on cp.clientid = c.clientid and cp.sourceloc = c.sourceloc 
) 
select * from phones where rnk = 1; 

Ich bezweifle, dass Sie wirklich eine vollständige äußere benötigt kommen. Die Abfrage sollte wahrscheinlich immer noch funktionieren, auch wenn Sie sie zurückfügen.