2017-04-19 6 views
1

Leute ratlos hier !!!
Erstens ist es das, was ich versuche zu erreichen: dannWählen Sie SQL-Logik


Wählen Sie alle Datensätze aus der Tabelle CUSTOMER_ORDER_DETAILS Tabelle unten dargestellt, und wenn mehrere Einträge für denselben CUSTOMER_NO existieren:
- wählen Sie den Eintrag mit BEZAHLT = 1
- wenn es mehr BEZAHLT = 1 Einträge vorhanden sind, dann wählen Sie den Datensatz mit TYPE = Y

Table

Erwartetes Ergebnis:
877, CU115, beleuchtet, 0, 1, X
878, CU111, Toi, 1, 1, Y
879, CU117, Florida, 1, 1, X

Mein Ansatz war das bekommen count (CUSTOMER_NO)> 1 mit GROUP BY bei CUSTOMER_NO, aber sobald ich die verbleibenden Spalten der Tabelle zur SELECT-Anweisung hinzufüge, zeigt die Spalte count einen Wert von 1 an. Beliebige Hinweise, um dies anzugehen oder zu implementieren, wenn- sonst irgendwie Logik?

+0

mysql oder sql-server? –

+0

die einfachste Lösung ist es, Ihre Logik zu sezieren und kombinieren sie versuchen, dass zuerst – maSTAShuFu

Antwort

1

Dies ist eine Priorisierungsabfrage. Hier ist eine Methode, zu tun, was Sie wollen:

select t.* 
from (select t.*, 
      row_number() over (partition by customer_no 
           order by paid desc, type desc 
           ) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

Dies setzt voraus, dass paid nimmt die Werte 0 und 1, und dass type die Werte X und Y.

+0

Gordon, danke für die Hilfe. Ich werde die Priorisierungsabfrage etwas lesen. Würde es Ihnen etwas ausmachen, die Logik ein wenig zu erklären? Dies könnte auch anderen helfen. – user1195192

+1

@ user1195192. . . Führen Sie die Unterabfrage aus und Sie werden sehen, was passiert. Die Zeilen, die Sie möchten, enden mit "seqnum" als "1". –

+0

Danke .. lesen Sie es weiter. – user1195192

1

Sie können diese Bedingungen mit einer order by Bedingung in row_number Funktion priorisieren.

select * from (
select t.*, 
row_number() over(partition by customer_no 
        order by case when paid=1 and type='Y' then 1 
           when paid=1 then 2 
           else 3 end) as rnum 
from customer_orders t 
) t 
where rnum=1 
  • Dies setzt voraus, da nur eine Zeile mit Typ sein kann, = ‚Y‘ je CUSTOMER_NO wenn es mit = für den gleichen CUSTOMER_NO 1 bezahlt mehrere Zeilen vorhanden sind.
  • Wenn mehrere Zeilen mit bezahlt = 1 vorhanden sind und alle einen Typ <> 'Y' haben, wird eine Zeile willkürlich zwischen ihnen ausgewählt.
+0

vkp, vielen Dank. Würde es Ihnen etwas ausmachen, die Logik ein wenig zu erklären? Dies könnte auch anderen helfen – user1195192

+1

@ user1195192 .. ich schlage vor, Sie experimentieren mit verschiedenen 'order by' Bedingungen in' row_number' und Sie werden erfahren, wie diese Abfrage funktioniert. –