【问题标题】:Counting with conditions有条件的计数
【发布时间】:2012-03-20 02:42:17
【问题描述】:

我有一张表,不同国家的值不同,例如:

编号|国家 | ==================== 1 |阿格利亚 | 2 |美国 | 1 |中国 | 1 |意大利 | 1 |意大利 | 1 |美国 | 4 |美国 | 1 |阿格利亚 |

我只对一个国家/地区的计数和总数感兴趣,但我无法想出一个查询来完成它。 id 1 的查询结果为:

编号| value_in_意大利 |全部的 =========================== 1 | 2 | 6

如您所见,我获得了意大利的价值和总价值。对于类似的表,什么样的查询会产生像上面这样的行?

【问题讨论】:

  • 您是如何创建格式良好的表格的??
  • @I__:检查我的个人资料,我总是保留一些很酷的链接:)
  • @I__:按我帖子下方的“编辑”按钮,您可以复制代码。

标签: mysql


【解决方案1】:

我能想到的适用于 MySQL 的最简单查询是:

select id, sum(country = 'Italy') values_in_Italy, count(*) Total from t
where id = 1

MySQL 不会强制您使用 group by id,因为它会不确定地采用一个 id,但 where 子句强制该列只有一个 id

【讨论】:

  • 如果只有意大利行,您将如何添加子句?因此,例如,如果我在没有“where id = 1”子句的情况下执行此操作,则结果中只会显示 id 1(因为其他的没有意大利计数)
  • 抱歉,我不太明白这个问题。要在任何查询中仅显示意大利行,您应该使用 where country = 'Italy',如果这是您的意思。
  • 这只会计算意大利的行数......我的意思是像'where values_in_Italy > 0'给你上面的查询
【解决方案2】:
SELECT A.ID,B.value_in_Italy,(SELECT COUNT(DISTINCT Country) AS total FROM YOURTABLE) AS          total
FROM YOURTABLE A,
(SELECT Country,COUNT(*) AS value_in_Italy
FROM YOURTABLE
WHERE COUNTRY='Italy'
GROUP BY Country) B
WHERE A.Country=B.Country

【讨论】:

  • 我希望这对你的请求有所帮助。我没有 mysql 来测试它。
【解决方案3】:

这是加载的示例数据

mysql> drop database if exists luqita;
Query OK, 1 row affected (0.03 sec)

mysql> create database luqita;
Query OK, 1 row affected (0.01 sec)

mysql> use luqita
Database changed
mysql> create table countrydata
    -> (
    ->     id int not null,
    ->     country varchar(32),
    ->     value int not null
    -> );
Query OK, 0 rows affected (0.10 sec)

mysql> insert into countrydata (id,country) values
    -> (1,'Argelia'  ),
    -> (2,'USA'      ),
    -> (1,'China'    ),
    -> (1,'Italy'    ),
    -> (1,'Italy'    ),
    -> (1,'USA'      ),
    -> (4,'USA'      ),
    -> (1,'Argelia'  );
Query OK, 8 rows affected, 1 warning (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 1

mysql> select * from countrydata;
+----+---------+-------+
| id | country | value |
+----+---------+-------+
|  1 | Argelia |     0 |
|  2 | USA     |     0 |
|  1 | China   |     0 |
|  1 | Italy   |     0 |
|  1 | Italy   |     0 |
|  1 | USA     |     0 |
|  4 | USA     |     0 |
|  1 | Argelia |     0 |
+----+---------+-------+
8 rows in set (0.00 sec)

mysql>

只为意大利算数

select id,SUM(IF(country='Italy',1,0)) italy_count,COUNT(IF(id=1,1,0)) id_count
from countrydata WHERE id=1;

这是针对样本数据的查询

mysql> select id,SUM(IF(country='Italy',1,0)) italy_count,COUNT(IF(id=1,1,0)) id_count
 ->    from countrydata WHERE id=1;
+----+-------------+----------+
| id | italy_count | id_count |
+----+-------------+----------+
|  1 |           2 |        6 |
+----+-------------+----------+
1 row in set (0.00 sec)

mysql>

这里是全包查询

select B.*,
    SUM(IF(A.country=B.country,1,0)) country_count,
    SUM(IF(B.id=A.id,1,0)) id_count
from
    countrydata A,
    (select distinct id,country from countrydata) B
group by B.id,B.country;

这是执行的包罗万象的查询

mysql> select B.*,
    ->     SUM(IF(A.country=B.country,1,0)) country_count,
    ->     SUM(IF(B.id=A.id,1,0)) id_count
    -> from
    ->     countrydata A,
    ->     (select distinct id,country from countrydata) B
    -> group by B.id,B.country;
+----+---------+---------------+----------+
| id | country | country_count | id_count |
+----+---------+---------------+----------+
|  1 | Argelia |             2 |        6 |
|  1 | China   |             1 |        6 |
|  1 | Italy   |             2 |        6 |
|  1 | USA     |             3 |        6 |
|  2 | USA     |             3 |        1 |
|  4 | USA     |             3 |        1 |
+----+---------+---------------+----------+
6 rows in set (0.00 sec)

mysql>

【讨论】:

    【解决方案4】:

    试试这个:

    select 1 id, sum(country = 'Italy') values_in_Italy, count(*) Total from t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-12
      • 2017-12-25
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 2014-08-01
      • 2015-11-04
      • 1970-01-01
      相关资源
      最近更新 更多