Mysql 按日期列出的一列中不同值的SQL计数

Mysql 按日期列出的一列中不同值的SQL计数,mysql,sql,select,count,pivot,Mysql,Sql,Select,Count,Pivot,我有一张桌子,看起来像: os date -- --- ios 2014-04-35 21:33:33 android 2014-04-35 21:33:33 ios 2014-04-35 21:33:33 ios 2014-04-35 21:33:33 我想得到一个输出,作为每个月ios/android的计数。就像: Year Month ios android 2015 01

我有一张桌子,看起来像:

os         date
--         ---
ios        2014-04-35 21:33:33 
android    2014-04-35 21:33:33
ios        2014-04-35 21:33:33
ios        2014-04-35 21:33:33
我想得到一个输出,作为每个月ios/android的计数。就像:

Year    Month    ios     android
2015    01       20      100
2015    02       400     20
差不多吧

这就是我现在拥有的。但这并不完全正确:

SELECT year(last_modified_date) as cy
     , month(last_modified_date) as cm
     , (SELECT COUNT(*) FROM device_info WHERE os='ios')
     , (SELECT COUNT(*) FROM device_info WHERE os='android')
FROM device_info
WHERE year(last_modified_date) IN (2014,2015)
GROUP BY year(last_modified_date)
       , month(last_modified_date);

您可以将条件聚合与
大小写
表达式一起使用:

select year(`last_modified_date`) as `Year`
     , month(`last_modified_date`) as `Month`
     , sum(`os` = 'ios') as `ios`
     , sum(`os` = 'android') as `android`
from `device_info`
where year(`last_modified_date`) in (2014, 2015)
group by year(`last_modified_date`)
       , month(`last_modified_date`);
Tru这是:

SELECT YEAR(di.date) AS 'Year', 
       MONTH(di.date) AS 'Month', 
       SUM(di.os = 'ios') AS 'ios', 
       SUM(di.os = 'android') AS 'android'
FROM device_info AS di
GROUP BY YEAR(di.date), MONTH(di.date);

suslov和Saharsh的回答表明,我们可以使用表达式有条件地返回1或0(或NULL),并使用求和聚合函数模拟“计数”操作。如果我们使用的表达式仅在条件为true时返回非null值,则可以使用计数聚合而不是求和,例如
COUNT(If(os='ios',os,null))
注意:WHERE子句中的谓词不可搜索。我们通常更喜欢可以在可用索引上使用范围扫描操作的形式的谓词,例如,
,其中last_modified_date>='2014-01-01'和last_modified_date<'2016-01-01'
。Bas karo DBA saheb。。bau agal nikli gya tame to。。阿玛丽帕克Kura Kalo ne…D