2017-11-08 3 views
-1

ich eine Tabelle ähnlich wie diese habenT SQL-Abfrage Datensätze finden

ID TestID AdddressID Value TestDate Case Investigation 
1  12  140  15 11/7/2005 Open  Open 
1  13  140  19 10/9/2005 Open  Open 

Wenn die ID zwei Adresse ID Aufzeichnungen habe ich dies möchte als

sollte
ID AdddressID Status 
1  140  New S&A 

Mein Bericht zeigen, nicht zeige, wenn ich die gleiche Adresse wieder 3 oder mehr bekomme

Aber wenn ich eine neue Adresse ID 155 in Zukunft bekomme, möchte ich neuesten Datensatz und Mein Bericht sein

ID AdddressID Status 
1  155  New A 

auch wieder, wenn ich wieder zu bekommen Adresse ID 140 (nach 155) Ich will nicht ID

ID TestID AdddressID  Status 
1  12  140   
1  13  140   New S&A 
1  14  155   New A 
1  15  140   Don't select this record 
+1

Anforderungen unklar. Sie möchten nur die letzte 'AddressID' anzeigen lassen, außer es gibt 3 oder mehr Instanzen dieser Adresse? Dann zeigt nichts? Und woher kommt der 'Status'? –

+0

Versuchen Sie, die Abfrage zu schreiben und zeigen Sie uns, mit welchem ​​Teil Sie Probleme haben. –

+0

Wenn eine ID zwei identische Adress-IDs hat, möchte ich den Datensatz auswählen und den Status (Neue Spalte) als "NewS & A" anzeigen. Wenn dieselbe Adress-ID wiederholt wird, möchte ich den Bericht nicht anzeigen. Aber wenn ich wieder mit unterschiedlicher Adress-ID komme, möchte ich den Datensatz mit zuletzt adressiertem und Status als 'New A' auswählen – Hanu

Antwort

0

es so zeigen, klingt das, was Sie wollen:

SELECT ID, AddressID, CASE WHEN COUNT(1) = 1 THEN 'New A' 
          ELSE 'New S&A' 
         END as [Status] 
FROM YourTable 
GROUP BY ID, AddressID 
HAVING COUNT(1) < 3 

Dies zeigt nur ID, Adressenkombinationen, die weniger als 3 Mal auftreten:

Mein Bericht Shoul d nicht zeigen, wenn ich die gleiche Adresse wieder 3 oder mehr

Entfernen Sie die HAVING..., wenn Sie diese sehen möchten.

Edit: Wenn Sie gerade die neueste Adresse ändern, um sehen möchten, verwenden Sie MAX() in einer Unterabfrage nur, um sicherzustellen, pro ID die neueste AddressID sehen

SELECT a.ID, a.AddressID, CASE WHEN COUNT(1) = 1 THEN 'New A' 
           ELSE 'New S&A' 
          END as [Status] 
FROM YourTable a 
JOIN (SELECT MAX(AddressID) AddressID, ID 
     FROM YourTable 
     GROUP BY ID) b ON a.ID = b.ID AND a.AddressID = b.AddressID 
GROUP BY a.ID, a.AddressID 
HAVING COUNT(1) < 3 
+1

Gut gemacht. Ich habe deine Lösung nicht gesehen, bevor ich meine gepostet habe. Beide sind sehr ähnlich - ich denke, großartige Köpfe denken ein ähnliches;) –

+0

Danke, aber es zeigt "New A" für die Datensätze mit der gleichen Adresse ID. Ich möchte "neues A", wenn der Datensatz eine andere Adress-ID hat. Außerdem sollte der Datensatz nicht ausgewählt werden, wenn ich 3 oder mehr Datensätze mit derselben Adress-ID habe. – Hanu

+0

@Hanu Ich denke ich folge dir etwas, aber könntest du Beispieltabellendaten zu deiner Frage hinzufügen, wie Alan in seiner Antwort? Fügen Sie dann eine Beispielausgabe hinzu und stellen Sie sicher, dass alle von Ihnen erwähnten Szenarien abgedeckt sind.Es ist leicht, zu der einzelnen Zeile zu gelangen, die Sie in Ihrer Frage zeigen, aber es ist schwierig, diese anderen Anforderungen zu verstehen, ohne Beispiele zu sehen. Randnotiz, ich werde erst morgen wieder online sein, aber ich werde zurück überprüfen, ob Sie noch Hilfe brauchen. –

1

Diese Nähte ziemlich einfach.

-- sample data 
if object_id('tempdb..#yourtable') is not null drop table #yourtable; 
create table #yourtable 
(
    ID int, 
    TestId int, 
    AddressID int, 
    [Value] int, 
    TestDate date, 
    [Case] varchar(20), 
    Investigation varchar(20) 
); 
insert #yourtable values 
(1, 12, 140, 15, '11/7/2005','Open','Open'), 
(1, 13, 140, 19, '10/9/2005','Open','Open'), 
(1, 14, 155, 19, '10/9/2005','Open','Open'); 

-- solution 
SELECT 
    ID, 
    AddressID, 
    [Status] = CASE COUNT(*) WHEN 1 THEN 'New A' WHEN 2 THEN 'New S&A ' END 
FROM #yourtable 
GROUP BY ID, AddressID; 

Ergebnisse

ID   AddressID Status 
----------- ----------- -------- 
1   140   New S&A 
1   155   New A 
+1

Prost für die gute Antwort +1 –

+1

Dies funktioniert Alan Danke, aber ich muss einige Verbesserungen machen, das ist okay, aber trotzdem danke für die Idee. Aber noch eine Kleinigkeit. Ich aktualisiere Frage – Hanu

+0

Ich aktualisierte Frage @AaronDietz – Hanu

Verwandte Themen