我有一个查询,其中我对结果进行分组:
SELECT brand, description, prodcode
FROM table
GROUP BY brand, prodcode
现在的结果是:
brand | description | prodcode
------------------------------
Brand1, Description1, Product1
Brand1, Description2, Product2
Brand1, Description3, Product4
我希望看到的是:
brand | description | prodcode
------------------------------
Brand1, Description1, Product1
Description2, Product2
Description3, Product4
如何在将重复数据发送到应用程序层之前如何抑制这些重复数据?
答案 0 :(得分:1)
总有办法。问题是"我们应该这样做"。请注意,您可以隐藏品牌数据。如果数据被重新排序,排序,则分拣机失去了知道哪个品牌是哪一行的能力。如果这只是一个打印报告,不能使用或预期用户无法操作数据,那么确定..但如果是这样,用户可以转储到excel并稍后操作...更好地拥有所有数据。
我个人觉得这些信息显示在电子数据上令人讨厌,但在打印表格或静态报告上都没问题。原因是:在电子设备上我可以导入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');
QUERY:
SELECT case when@var <> 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的用户变量并将其设置为&#39;&#39;在表foo的第一条记录中。然后我们将@var分配给第一条记录的品牌。当SQL交叉连接到第二个提交时@var现在是第一个记录的品牌。如果品牌匹配,则不会显示任何记录,如果品牌不匹配,我们会更改@var的值并显示新值。
风险:
答案 1 :(得分:0)
您可能需要考虑在品牌列上使用SELECT DISTINCT来仅返回不同的值。有关更多信息:https://www.w3schools.com/sql/sql_distinct.asp。但是,在“SQL”中,“品牌”列折叠为只有一行但仍然与“描述”和“prodcode”中的其他三行相关联。