【问题标题】:Selecting total value, and a subset of it选择总值及其子集
【发布时间】:2012-03-20 02:00:09
【问题描述】:

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

编号|国家 |价值 ==================== 1 |阿格利亚 | 8 2 |美国 | 10 1 |中国 | 12 1 |意大利 | 13

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

编号| value_in_意大利 |全部的 =========================== 1 | 13 | 33

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    这是您需要的查询:

    select id,SUM(IF(country='Italy',value,0)) italy_value,SUM(value) id_values
    from countrydata where id = 1;
    

    这是您的示例数据:

    drop database if exists luqita;
    create database luqita;
    use luqita
    create table countrydata
    (
        id int not null,
        country varchar(32),
        value int not null
    );
    insert into countrydata values
    (1,'Argelia',  8 ),(2,'USA'    , 10 ),
    (1,'China'  , 12 ),(1,'Italy'  , 13 );
    select * from countrydata;
    

    这是您加载的示例数据:

    mysql> drop database if exists luqita;
    Query OK, 1 row affected (0.03 sec)
    
    mysql> create database luqita;
    Query OK, 1 row affected (0.02 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.12 sec)
    
    mysql> insert into countrydata values
        -> (1,'Argelia',  8 ),(2,'USA'    , 10 ),
        -> (1,'China'  , 12 ),(1,'Italy'  , 13 );
    Query OK, 4 rows affected (0.05 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> select * from countrydata;
    +----+---------+-------+
    | id | country | value |
    +----+---------+-------+
    |  1 | Argelia |     8 |
    |  2 | USA     |    10 |
    |  1 | China   |    12 |
    |  1 | Italy   |    13 |
    +----+---------+-------+
    4 rows in set (0.00 sec)   
    
    mysql>
    

    这是执行的建议查询:

    mysql> select id,SUM(IF(country='Italy',value,0)) italy_value,SUM(value) id_values
        -> from countrydata where id = 1;
    +----+-------------+-----------+
    | id | italy_value | id_values |
    +----+-------------+-----------+
    |  1 |          13 |        33 |
    +----+-------------+-----------+
    1 row in set (0.00 sec)
    
    mysql>
    

    现在,如果您想同时针对所有行运行此查询,请尝试以下全包式查询:

    select
        B.id,
        SUM(IF(A.country=B.country,B.value,0)) country_value,
        SUM(IF(A.id=B.id,A.value,0)) id_values
    from
        countrydata A,
        countrydata B
    group by B.country;
    

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

    mysql> select
        ->     B.id,
        ->     SUM(IF(A.country=B.country,B.value,0)) country_value,
        ->     SUM(IF(A.id=B.id,A.value,0)) id_values
        -> from
        ->     countrydata A,
        ->     countrydata B
        -> group by B.country;
    +----+---------------+-----------+
    | id | country_value | id_values |
    +----+---------------+-----------+
    |  1 |             8 |        33 |
    |  1 |            12 |        33 |
    |  1 |            13 |        33 |
    |  2 |            10 |        10 |
    +----+---------------+-----------+
    4 rows in set (0.00 sec)
    
    mysql>
    

    试试看!!!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多