子查询与象,数,组由

子查询与象,数,组由

问题描述:

我的表:子查询与象,数,组由

+----+------------+-------+-------+ 
| id | Name | Type | Code | 
+----+------------+-------+-------+ 
| 1 | /Color  | black | cod-1 | 
| 2 | Colorless | black | cod-2 | 
| 3 | Colorful | black | cod-1 | 
| 4 | Color/  | black | cod-3 | 
| 5 | Colored | blue | cod-1 | 
| 6 | Bottle  | black | cod-1 | 
| 7 | Bottles | black | cod-2 | 
| 8 | Bottle/z | black | cod-1 | 
| 9 | Bottleneck | blue | cod-1 | 
+----+------------+-------+-------+ 

对于选定的类型,我需要GROUP BY(等)的名称,并通过不同的码数。

最后,最终计必须给:

Type  Name like  Count Code 

Black  Color   3 

Black  Bottle   2 

Blue  Color   1 

Blue  Bottle   1 

...等不可预知的,随机包含数千个字符的相似序列的名字。 到目前为止,任何尝试都失败了。任何线索?

+1

那么,什么决定'像''的名字......需要某种查找表来确定一个。技术上'颜色'中的'o'就像'瓶子'中的'o' ... – sgeddes 2014-12-13 01:16:46

试试这个。

Select distinct Type, Name, count(code) from MyTable 
    group by Type, Name 
+0

这不会做OP所要求的。 – jpw 2014-12-13 01:40:22

+0

@ hamala94我完全同意jpw – Wailmanager 2014-12-13 10:48:10

来完成你想要什么,我认为你要么需要一个查找表,从中可以匹配的名字(表保持同义词),或者你可以硬编码像这样的逻辑:

SELECT 
    type AS "Type", 
    CASE 
     WHEN name LIKE '%Color%' THEN 'Color' 
     WHEN name LIKE '%Bottle%' THEN 'Bottle' 
    END AS "Name", 
    COUNT(DISTINCT code) AS "Count Code" 
FROM your_table 
GROUP BY 
    type, 
    CASE 
     WHEN name LIKE '%Color%' THEN 'Color' 
     WHEN name LIKE '%Bottle%' THEN 'Bottle' 
    END 
ORDER BY type 

这会给你你想要的结果,见SQL Fiddle这显然不是一个好的解决方案 - 使用查找表会好很多。

使用查找表可以做这样的:

create table lookup (k varchar(20), v varchar(30)); 
insert into lookup values 
('Bottle','Bottle'),('Bottle','Bottles'), 
('Bottle','Bottle/z'),('Bottle','Bottleneck'), 
('Color','Color'),('Color','Colorless'), 
('Color','Colorful'),('Color','/Color'), 
('Color','Color/'),('Color','Colored'); 

SELECT 
    type AS "Type", 
    l.k AS "Name", 
    COUNT(DISTINCT code) AS "Count Code" 
FROM your_table tbl 
INNER JOIN lookup l on tbl.name = l.v 
GROUP BY type, l.k 

Sample SQL Fiddle使用查找表。

+0

代码是完美的例子(对我来说太复杂了!)。无论如何,上表是对现实的极端简化,其中有成千上万的UNPREDICTABLE和RANDOMIZED名称,但包含了相似的字符序列。所以,我无法预测它们在桌子上的样子。在这种情况下,查找表似乎并没有达到我所需要的,因为我无法预先知道将插入哪个名称以及如何写入。实际上,名称,类型和代码通过表单上传,任何人都使用“个人而非统一的方式”插入数据。 – Wailmanager 2014-12-13 10:46:09

+0

@Wailmanager不,在你描述的情况下,它可能很难让它起作用。我猜想最好的选择可能是限制在UI级输入什么,但也许这不是一个选项。 – jpw 2014-12-13 12:02:47