2016-07-28 8 views
0

zurückgeben Ich habe eine Datenbank mit Elementen, die jede verfügbare Sorte eines bestimmten Elements in einer separaten Zeile speichert. Nur durch die Itemnamen gehen, sehen die Datenbankeinträge wie folgt aus:Versuchen, nur einen Typ jedes Elements aus der Datenbank

10316-00-B 
10316-00-M 
10316-02-B 
10316-03-B 
10316-04-B 
10316-23-B 
10316-88-B 

... wo „10316“ ist der eigentliche Punkt, und dann alles nach, dass eine bestimmte Sorte Typ darstellt. Ich möchte eine Abfrage schreiben, die nur einen Datensatz für Element "10316" (oder was auch immer) zusammen mit den Informationen, die diesem Element in allen anderen Tabellenspalten zugeordnet sind, zurückgibt und den Rest ignoriert. So würde ich den Rekord für den Artikel "10316-00-B" bekommen, aber keinen der anderen. Dieser Prozess wird für alle anderen von meiner Abfrage zurückgegebenen Elemente wiederholt.

Ich bin nicht wählerisch über welches Element einer bestimmten Gruppe zurückgegeben wird; der obere würde tun. Ich sehe nur eine Auflistung für die Artikel 10316, 10317, 10318 und weiter, anstatt für jeden Artikel und jede Variation.

Ich habe versucht, DISTINCT links (columnName, 5), aber das filtert nicht die Datensätze, wie ich brauche. Weiß jemand, wie man das macht? Ich benutze Sql Server 2008 R2.

UPDATE: Ich versuche, die von @ mo2 zur Verfügung gestellte Lösung zu implementieren - es scheint, dass diese am ehesten alle Daten für ein bestimmtes Element zurückgibt, was ich will. Leider bekomme ich den Fehler "Für die Spalte 1 von 't' wurde kein Spaltenname angegeben, und ich bin mir nicht sicher, wie ich das korrigieren soll. Meine Version seiner Abfrage sieht wie folgt aus:

SELECT * FROM (
    select left(item, 5), col1, col2, ... , row_number() 
    over (partition by LEFT(item, 5) order by item) rn 
    from Table  
) t 
where rn = 1 

FINAL UPDATE: Ich habe die Antwort von @kbball als Lösung markiert, aber eigentlich sollte mo2 auch zu @ Kredit gehen. Die Antwort von @kbball hat mir geholfen, die Antwort von @ mo2 zu verstehen.

Antwort

0

Dieser ist ein wenig einfacher:

SELECT DISTINCT sub.item 
FROM (SELECT LEFT(columnName,5) AS item FROM Table) sub 
0

Sie werden den spezifischen Sortentyp als separates Feld für jedes Element, ebenso wie eine allgemeine Technik für Datenbank-Design haben wollen:

10316 | 00 | B

Dann können Sie mit Query:

SELECT DISTINCT(item) 
FROM itemlist 
WHERE itemnum=10316; 

this helps

1

Distinct funktionieren würde, wenn Sie nur für die eine Spalte allein waren auf der Suche. Wenn Sie jedoch die restlichen Spalten hinzufügen, wird die Datei gelöscht. Sie können dies versuchen:

select * from (
    select 
    left(col1, 5) col1, 
    col2, 
    col3, 
    col4, 
    row_number() over (partition by left(col1, 5) order by col1) rn 
    from your_table 
) t 
where rn = 1 

Sie die order by zu einer anderen Spalte wie ein Datum/Zeit-Spalte ändern, wenn Sie den ersten oder letzten Datensatz für jedes Element erhalten möchten.

+0

ich Ihre Lösung bin versucht, aber ich bin nicht sicher, was die „t“ soll nach der schließenden Klammer sein. Ich erhalte den Fehler "Für Spalte 1 von 't' wurde kein Spaltenname angegeben." – bmurrell30

+0

Das "t" ist nur ein Alias ​​für die Sub-Abfrage, die ich denke, SQL-Server benötigt. Sie können versuchen, die Unterabfrage allein auszuführen, um zu verstehen, wie sie funktioniert. Nicht sicher, warum Sie den Fehler erhalten, ohne die Abfrage zu sehen. – mo2

Verwandte Themen