2017-06-07 1 views
2
A | B | C | D | E 
a y 6 12 21 
b n 3 10 5 
c n 4 12 12 
c n 7 12 2 
c y 1 12 22 
d n 6 10 32 
d n 7 10 32 

Output-Tabelle basierend auf anderen Feldern in einem Feld gleichen Daten:Um 1 Datensatz aus mehreren Datensätzen zu ziehen

A | B | C | F 
a y 6 21 
b n 3 12 
c y 1 22 
d n 6 10 

Ich habe eine Tabelle, die bestimmte Felder enthält. Von dieser Tabelle möchte ich doppelte Datensätze in A entfernen und die Ausgabetabelle erzeugen.

Nun wird das Feld F basierend auf dem Feld C berechnet, wenn für die Datensätze in A keine Duplikate vorhanden sind. Wenn also nur ein Datensatz von A in A vorhanden ist, dann ist die F-Spalte (Output Tabelle) zieht den Datensatz in E-Spalte. Wenn also Datensatz b in Feld C den Wert < 5 hat, zieht die F-Spalte (Ausgabetabelle) den Datensatz in Spalte D für b. Dies konnte ich anhand einer Fallaussage erreichen.

Wenn jedoch doppelte Datensätze in Spalte A vorhanden sind, möchte ich nur einen der Datensätze basierend auf der Spalte B. Es sollte nur der Datensatz abgerufen werden, der in Spalte B den Wert 'y' und in Spalte F enthält der Wert aus Spalte E. Wenn keiner der doppelten Datensätze in A den Wert 'n' in der Spalte B hat, ziehen Sie einen beliebigen Datensatz mit Spalte D als Spalte F in der Ausgabetabelle. Ich bin nicht in der Lage, diesen Teil herauszufinden.

Bitte lassen Sie mich wissen, wenn etwas nicht klar ist.

-Code Ich bin mit:

SELECT A,B,C, 
    CASE 
    WHEN (SELECT COUNT(*) FROM MyTable t2 WHERE t1.A=t2.A)>1 
     THEN (SELECT TOP 1 CASE WHEN b='y' THEN E ELSE D END 
      FROM MyTable t3 
      WHERE t3.A=t1.A 
      ORDER BY CASE WHEN b='y' THEN 0 ELSE 1 END) 
    ELSE { 

case when cast(C as float) >= 5.00 then (Case when E = '0.00' then D else E end) 
    when cast(C as float)< 5.00 then D end) 


} 
    END AS F 
FROM MyTable t1 
+0

Tag Ihre Frage mit der Datenbank Sie verwenden. –

Antwort

1

Sie können diese Logik in einer Funktion kapseln wollen es sauberer aussehen zu lassen, aber die Logik wie diese gehen würde:

Wenn der Datensatz Anzahl der Zeilen in der Tabelle mit dem gleichen Wert für A wie die aktuelle Zeile größer als 1 ist, und wählen Sie den TOP 1 Datensatz mit diesem Wert für A ORDER BY CASE WHEN b='y' THEN 0 ELSE 1 END

andere CASE WHEN b='y' verwendet mich zu bestimmen, f verwenden Sie die Spalte E oder für die Ausgabespalte F.

Und ELSE (die Anzahl der Datensätze ist nicht größer als 1), verwenden Sie Ihren vorhandenen CASE-Ausdruck.

EDIT: Hier ist eine Pseudo codey Erklärung:

WITH cte AS (SELECT A,B,C, 
    ROW_NUMBER() OVER (PARTITION BY A, ORDER BY CASE WHEN b='y' THEN 0 ELSE 1 END) rn 
FROM MyTable 
) 
SELECT A,B,C, 
    CASE 
    WHEN (SELECT COUNT(*) FROM MyTable t2 WHERE t1.A=t2.A)>1 
     THEN CASE WHEN b='y' THEN E ELSE D END 
    ELSE {use your existing CASE Expression} 
    END AS F 
FROM cte t1 
WHERE rn=1 
+0

Ich habe das nicht ganz verstanden - 'WENN die Anzahl der Zeilen in der Tabelle mit dem gleichen Wert für A wie die aktuelle Zeile größer als 1 ist, DANN WÄHLEN Sie den TOP 1 Datensatz mit diesem Wert für A ORDER BY CASE WHEN aus b = 'y' DANN 0 ELSE 1 ENDE 'Kannst du es erklären? – Rahul

+0

Sie sagen für einen Datensatz mit mehr als 1 Werte in A dann .... – Rahul

+0

Es zeigt immer noch die gleiche Anzahl von Datensatz und die Spalte F zeigt den Wert für den ersten Datensatz von A. Nicht ihre spezifischen Werte. Es ist wegen der TOP 1 – Rahul

Verwandte Themen