Es gibt immer einen Weg. Die Frage ist "Sollen wir das tun". Beachten Sie, dass Sie dadurch die Markendaten ausblenden. Wenn die Daten neu geordnet, sortiert werden, verliert der Sortierer die Fähigkeit zu wissen, welche Marke für welche Reihe ist. Wenn dies nur ein gedruckter Bericht ist, der nicht auf ein PDF zurückgegriffen werden soll oder erwartet werden soll, wo ein Benutzer die Daten nicht manipulieren kann, dann ok alle Daten.
Ich persönlich finde diese Anzeige von Informationen auf elektronischen Daten unangenehm, aber auf gedruckten Formularen oder statischen Berichten in Ordnung. Der Grund:Auf elektronischem Wege kann ich in Excel sortieren und mit den Daten spielen; aber wenn in Spalten redundante Daten "fehlen", wird die elektronische Manipulation problematisch.
CREATE Table foo (
brand varchar(20),
description varchar(20),
prodcode varchar(20));
Insert into foo values ('Brand1', 'Description1', 'Product1'),
('Brand1', 'Description2', 'Product2'),
('Brand1', 'Description3', 'Product4'),
('Brand2', 'Description3', 'Product4'),
('Brand2', 'Description3', 'Product4'),
('Brand1', 'Description3', 'Product3');
FRAGE:
SELECT case [email protected] <> f.brand then @Var :=brand end as Brand
, f.description
, f.prodcode
FROM (SELECT * FROM foo ORDER BY brand, description, prodcode) f
CROSS JOIN (SELECT @var := '') b
ERGEBNISSE:
Brand description prodcode
Brand1 Description1 Product1
(null) Description2 Product2
(null) Description3 Product3
(null) Description3 Product4
Brand2 Description3 Product4
(null) Description3 Product4
Warum das funktioniert:
Die Magie passiert im Cross Join und bei der Fallbewertung.
Es gibt 1 Tisch. Wir sortieren die Aufzeichnungen, bevor wir beitreten. Wir erstellen eine Benutzervariable namens @var und setzen sie auf '' im ersten Datensatz in der Tabelle foo. Dann weisen wir @var der Marke des ersten Datensatzes zu. Wenn der SQL-Cross-Join mit dem zweiten Feld verknüpft wird, ist @var jetzt die Marke des ersten Datensatzes. Wenn die Marken übereinstimmen, wird kein Datensatz angezeigt, wenn die Marken nicht übereinstimmen, ändern wir den Wert von @var und zeigen den neuen Wert an.
Risiken:
- Wenn andere Tabellenverknüpfungen auftreten oder die Reihenfolge in der Tabelle nicht wie gewünscht ist, müssen wir zuerst eine Unterabfrage für "foo" durchführen, um nach Marke zu sortieren
- Jede Bestellung von darauf anzuwenden, die Marke1 betrifft, ist jetzt wertlos
- Es ist nicht so wiederverwendbar. Ein anderes Modul, das möglicherweise die Daten nutzen möchte (Ansicht), kann dies nicht mehr, da die Marke auf einigen der Datensätze ausgeblendet wurde.