常に方法があります。問題は「これをすべきか」です。これを行うと、ブランドデータが非表示になることに注意してください。データが並べ替えられ、並べ替えられると、ソーターはどのブランドがどの行に対応しているかを知ることができなくなります。これが、ユーザーがデータを操作できないPDFに頼ったり、期待されたりしない印刷されたレポートである場合は、OKです。しかし、そうであれば、ユーザーはダンプして後で優れた操作を行うことができます...すべてのデータ。
私は個人的に、この情報の表示は電子データでは不快だと思いますが、印刷されたフォームや静的なレポートでは問題ありません。理由:電子では、Excelにインポートして、データを操作できます。ただし、列に冗長データが「欠落」していると、電子操作が問題になります。
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');
クエリ:
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
結果:
Brand description prodcode
Brand1 Description1 Product1
(null) Description2 Product2
(null) Description3 Product3
(null) Description3 Product4
Brand2 Description3 Product4
(null) Description3 Product4
これが機能する理由:
魔法はクロスジョインとケース評価で起こります。
テーブルが1つあります。参加する前にレコードを並べ替えています。 @varというユーザー変数を作成し、テーブルfooの最初のレコードで''に設定しています。次に、@varを最初のレコードのブランドに割り当てます。 SQLクロスが2番目にファイルされた@varに結合すると、最初のレコードのブランドになります。ブランドが一致する場合、レコードは表示されません。ブランドが一致しない場合、@ varの値を変更して、新しい値を表示します。
リスク:
- 他のテーブル結合が発生した場合、またはテーブルでの順序が希望どおりでない場合は、最初に「foo」でサブクエリを実行してブランド別に順序付けする必要があります
- brand1を含むこれに注文を適用することは今では価値がありません
- 再利用可能ではありません。データ(ビュー)を活用したい別のモジュールは、ブランドが一部のレコードに隠されているため、利用できなくなりました。