Zawsze jest sposób. Pytanie brzmi:„Czy powinniśmy to zrobić”. Zauważ, że robiąc to, ukrywasz dane marki. Jeśli dane są ponownie uporządkowane, posortowane, sortownik traci możliwość rozpoznania, która marka jest dla jakiego rzędu. Jeśli jest to tylko wydrukowany raport, którego nie można odwoływać się ani oczekiwać w pliku PDF, w którym użytkownik nie może manipulować danymi, to ok.. Ale jeśli tak jest, użytkownik może zrzucić, aby osiągnąć Excel i później manipulować ... lepiej mieć wszystkie dane.
Osobiście uważam, że takie wyświetlanie informacji jest niesmaczne na danych elektronicznych, ale w porządku na drukowanych formularzach lub statycznych raportach. Powód:w wersji elektronicznej jestem w stanie zaimportować do sortowania Excela i bawić się danymi; ale jeśli w kolumnach „brakuje” nadmiarowych danych, manipulacja elektroniczna staje się problematyczna.
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');
ZAPYTANIE:
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
WYNIKI:
Brand description prodcode
Brand1 Description1 Product1
(null) Description2 Product2
(null) Description3 Product3
(null) Description3 Product4
Brand2 Description3 Product4
(null) Description3 Product4
Dlaczego to działa:
Magia dzieje się w łączeniu krzyżowym i ocenie przypadku.
Jest 1 stół. Porządkujemy rekordy, zanim dołączymy. Tworzymy zmienną użytkownika o nazwie @var i ustawiamy ją na „” w pierwszym rekordzie w tabeli foo. Następnie przypisujemy @var do marki pierwszego rekordu. Kiedy krzyż SQL łączy się z drugim polem, @var jest teraz marką pierwszego rekordu. Jeśli marki się zgadzają, nie jest wyświetlany żaden rekord, jeśli marki nie pasują, zmieniamy wartość @var i wyświetlamy nową wartość.
Zagrożenia:
- my, jeśli wystąpią inne połączenia tabel lub kolejność w tabeli nie jest taka, jaka jest pożądana, musielibyśmy najpierw wykonać podzapytanie na „foo”, aby zamówić według marki
- zastosowanie dowolnego zamówienia do tego, które dotyczy marki1, jest teraz bezwartościowe
- Nie jest tak wielokrotnego użytku. Inny moduł, który może chcieć wykorzystać dane (widok), nie jest już w stanie tego zrobić, ponieważ marka została ukryta w niektórych rekordach.