SQL - 计数记录&根据值更新多个列

时间:2017-12-08 09:44:49

标签: mysql sql

我有两张桌子......帐户和税。在表税中,我想更新记录(?),具体取决于表帐户中可用的列类别,如下所示:

表'帐户'

id|cat2|cat3
1|A|Active
2|A|Active
3|A|Inactive
4|A|Active
5|B|Inactive
6|B|Active

表'税'

id|category|count_total|count_active|count_inactive
1|A|?|?|?
2|B|?|?|?

期望的结果:

id|category|count_total|count_active|count_inactive
1|A|4|3|1
2|B|2|1|1

对于count_total,我试过这个:

UPDATE tax t2,
(   SELECT count(*) 
    FROM accounts 
) t1
SET t2.count_total = t1.count(*)
WHERE t1.cat2 = t2.category;

2 个答案:

答案 0 :(得分:2)

您可以使用加入来更新税表

UPDATE tax t2 
JOIN (
    SELECT 
    cat2,
    COUNT(*) cnt,
    SUM(cat3 = 'Active') count_active,
    SUM(cat3 = 'Inactive') count_inactive
    FROM
    accounts 
    GROUP BY cat2
) t1 
ON t1.cat2 = t2.category 
SET t2.count_total = t1.cnt ,
    t2.count_active = t1.count_active,
    t2.count_inactive = t1.count_inactive 

Demo

答案 1 :(得分:2)

没有JOIN的另一个版本:

UPDATE tax 
    SET 
    count_total = (
        SELECT COUNT(*) 
        FROM accounts 
        WHERE accounts.cat2 = tax.category 
    ),
    count_active = (
        SELECT COUNT(*) 
        FROM accounts 
        WHERE accounts.cat2 = tax.category AND accounts.cat3 = 'Active'
    ),
    count_inactive = (
        SELECT COUNT(*) 
        FROM accounts 
        WHERE accounts.cat2 = tax.category AND accounts.cat3 = 'Inactive'
    );

<强> Demo