用SQL计算具有diff格式的项目

时间:2018-09-16 01:59:23

标签: sql sqlite

我很困惑如何计算相同但格式不同的项目。例如,我们想知道人们有多少种不同的水果,并具有以下数据:

Mary|Apple|
Mary|apple|
Mary|Apple |
Mary|Orange|
Liu|Grape|
Liu|Apple|

我希望输出

Mary|2
Liu|2

但是如果我做count(distinct fruits),我会得到

Mary|4
Liu|2

在这种情况下,是否有任何处理格式的方法?

3 个答案:

答案 0 :(得分:2)

对水果名称的小写形式进行计数:

SELECT
    name,
    COUNT(DISTINCT LOWER(TRIM(fruit))) AS cnt
FROM yourTable
GROUP BY
    name;

Demo

该演示在MySQL中进行,但相同的逻辑在SQLite中也应工作。

答案 1 :(得分:2)

您可以数一下:

  • 删除开头和结尾的空格-使用TRIM()
  • 删除字母大小写-使用LOWER()

如:

select
    name,
    count(distinct lower(trim(fruits))) 
  from my_table
  group by name

如果name列碰巧有相似的不规则之处,则可以使用相同的策略。

答案 2 :(得分:1)

DISTINCT并不是这里唯一的工具。您可以将GROUP BY与列文本的规范化版本一起使用,以将所有不同的大小写和尾随空格合并为一个。例如:

SELECT name, fruit, count(fruit) AS cnt
FROM test
GROUP BY name, trim(upper(fruit));

给我

name        fruit       cnt       
----------  ----------  ----------
Liu         Apple       1         
Liu         Grape       1         
Mary        Apple       3         
Mary        Orange      1         

但是,您似乎希望每人拥有不同类型的水果总数。所以...

WITH totals(name, fruit) AS
  (SELECT name, fruit
   FROM test
   GROUP BY name, trim(upper(fruit)))
SELECT name, count(fruit) AS fruits
FROM totals
GROUP BY name;

给我

name        fruits    
----------  ----------
Liu         2         
Mary        2