2017-05-18 4 views
0

Ich habe die folgende Situation. Ich habe einen Tisch mit allen Informationen des Artikels. Ich möchte die gleiche Spalte mit sich selbst vergleichen. weil ich mehrere Arten von Artikeln habe. Einzelprodukt und Master-Produkt. Der einzige Weg, um Unterschiede zu machen, ist die SKU. beispielsweise.SQL Validieren Sie eine Spalte mit der gleichen Spalte

ID | SKU 
1 | 11111 
2 | 11112 
3 | 11113 
4 | 11113-5 
5 | 11113-8 
6 | 11114 
7 | 11115 
8 | 11115-1-W 
9 | 11115-2 
10 | 11116 

Ich möchte nur aufzulisten oder/und nur die sku zu zählen, die voll sind einzigartig. folgen Sie dem Beispiel die SKU, die eindeutig sind und keine Variante haben (ID = 1, 2, 6 und 10) Ich möchte eine Abfrage erstellen, wo, wenn 11113 wieder auf der Spalte sind nicht cout. also insgesamt werde ich 4 einzigartige sku und nicht "6 (insgesamt)" sein. Lass es mich wissen, bitte. wenn das möglich ist.

+0

Bitte bearbeiten Sie Ihre Frage, um eine Tabelle mit der gewünschten Ausgabe zu erhalten. – KindaTechy

+0

Ist die Länge der "Master" SKU immer genau 5 Zeichen? – Bohemian

Antwort

0

Sie können dies tun, indem Sie die eindeutigen Zeilen gruppieren und zählen.

Zuerst müssen wir Ihre Tabelle nehmen und eine neue Spalte hinzufügen, MasterSKU. Dies sind die ersten fünf Zeichen der Spalte SKU. Sobald wir die MasterSKU haben, können wir dann GROUP BY es. Dies bündelt alle Zeilen mit den gleichen MasterSKU. Sobald wir gruppieren, erhalten wir Zugriff auf Aggregatfunktionen wie COUNT(). Wir werden diese Funktion verwenden, um die Anzahl der Zeilen für jede MasterSKU zu zählen. Dann werden wir alle Zeilen ausfiltern, die eine COUNT() über 1 haben. Dadurch bleiben nur noch die eindeutigen Zeilen übrig.

Nehmen Sie diese eindeutige Liste und LEFT JOIN es zurück in Ihre ursprüngliche Tabelle, um die IDs zu greifen.

SELECT ID, A.MasterSKU 
FROM (
    SELECT 
     MasterSKU = SUBSTRING(SKU,1,5), 
     MasterSKUCount = COUNT(*) 
    FROM MyTable 
    GROUP BY SUBSTRING(SKU,1,5) 
    HAVING COUNT(*) = 1 
) AS A 
LEFT JOIN (
    SELECT 
     ID, 
     MasterSKU = SUBSTRING(SKU,1,5) 
    FROM MyTable 
) AS B 
ON A.MasterSKU = B.MasterSKU 

enter image description here

eine Sache Jetzt bemerkte ich von Ihnen Beispiel. Die ursprüngliche SKU-Spalte sieht wirklich wie drei Spalten in einem aus. Wir haben mehrere Werte, die mit Hypen verbunden sind.

11115-1-W

Es kann ein Grund dafür sein, aber die meisten wahrscheinlich, dass diese verletzt first normal form und wird die Datenbank schwer Abfrage machen. Es ist Teil des Grundes, warum solch eine komplizierte Abfrage benötigt wird. Wenn die SKU-Spalte wirklich mehrere Dinge repräsentiert, dann sollten Sie vielleicht überlegen, sie in MasterSKU, Version und Farbe aufzuteilen oder was auch immer jeder Bindestrich darstellt.

1

die Länge des Master-SKUs sind 5 Zeichen, versuchen Sie dies Angenommen:

Diese Abfrage verknüpft Master SKUs Kind sind, aber filtert erfolgreich verbindet
select a.* 
from mytable a 
left join mytable b on b.sku like concat(a.sku, '%') 
where length(a.sku) = 5 
and b.sku is null 

- lasse SKUs nur einsame Meister.

+0

Im Vergleich zu meiner Antwort macht das Filtern nach Länge eine viel sauberere Abfrage. Nett. –

Verwandte Themen