子查询与象,数,组由
我的表:子查询与象,数,组由
+----+------------+-------+-------+
| 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
...等不可预知的,随机包含数千个字符的相似序列的名字。 到目前为止,任何尝试都失败了。任何线索?
试试这个。
Select distinct Type, Name, count(code) from MyTable
group by Type, Name
这不会做OP所要求的。 – jpw 2014-12-13 01:40:22
@ 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使用查找表。
代码是完美的例子(对我来说太复杂了!)。无论如何,上表是对现实的极端简化,其中有成千上万的UNPREDICTABLE和RANDOMIZED名称,但包含了相似的字符序列。所以,我无法预测它们在桌子上的样子。在这种情况下,查找表似乎并没有达到我所需要的,因为我无法预先知道将插入哪个名称以及如何写入。实际上,名称,类型和代码通过表单上传,任何人都使用“个人而非统一的方式”插入数据。 – Wailmanager 2014-12-13 10:46:09
@Wailmanager不,在你描述的情况下,它可能很难让它起作用。我猜想最好的选择可能是限制在UI级输入什么,但也许这不是一个选项。 – jpw 2014-12-13 12:02:47
那么,什么决定'像''的名字......需要某种查找表来确定一个。技术上'颜色'中的'o'就像'瓶子'中的'o' ... – sgeddes 2014-12-13 01:16:46