2013-07-28 40 views
0

编辑:我改变了表格。请参阅更新的表:组合字段时获得计数

在我的示例表

post   status  
------------- ------------- 
post1   delivered 
post2   undelivered 
post3   delayed 
post4   delivered 
post5   undelivered 

是否有可能得到的delivered数量和组合在单个查询undelivered + delayed多少?

像这样:

post   status  
------------- ------------- 
delivered  2 
undelivered  3 
+1

如果你在1排中得到结果,你关心吗?或2行是好吗?如果是2,那么您可以在2个查询之间使用UNION。这有帮助吗? – Artem

+0

你想要的输出是什么? –

回答

2
SELECT 
    SUM(IF(status = 'delivered', 1, 0)) as `delivered_count`, 
    COUNT(postid) as `all_count` 
FROM 
    table 

应该正常工作。这说明有仅是deliveredundelivered状态 - 如果有更多的,但你还是只想计算这两个,你可以做到以下几点:

SELECT 
    SUM(IF(status = 'delivered', 1, 0)) as `delivered_count`, 
    SUM(IF(status = 'delivered' OR status = 'undelivered', 1, 0)) as `all_count` 
FROM 
    table 

如果你想deliveredundelivered计数分别,你可以使用GROUP BY

SELECT 
    COUNT(postid), 
    status 
FROM 
    table 
WHERE 
    status IN ('delivered', 'undelivered') 
GROUP BY 
    status 
0
SELECT COUNT(*) 
FROM table 
GROUP BY status = 'delivered' 
ORDER BY status = 'delivered' DESC 

这将导致

count of delivered 
count of everything else 
0

假设deliveredundelivereddelayed是唯一可用的状态,

SELECT SUM(CASE WHEN status = 'delivered' THEN 1 END) `delivered`, 
     SUM(CASE WHEN status <> 'delivered' THEN 1 END) `delayed + undelivered` 
FROM tableName 

输出

╔═══════════╦═══════════════════════╗ 
║ DELIVERED ║ DELAYED + UNDELIVERED ║ 
╠═══════════╬═══════════════════════╣ 
║   2 ║      3 ║ 
╚═══════════╩═══════════════════════╝ 

根据您的修改,你希望它有多行,

SELECT CASE WHEN status = 'delivered' THEN 'delivered' 
        ELSE 'undelivered' 
     END post, 
     COUNT(*) totalCount 
FROM tableName 
GROUP BY CASE WHEN status = 'delivered' THEN 'delivered' 
        ELSE 'undelivered' 
      END 

输出

╔═════════════╦════════════╗ 
║ POST  ║ TOTALCOUNT ║ 
╠═════════════╬════════════╣ 
║ delivered ║   2 ║ 
║ undelivered ║   3 ║ 
╚═════════════╩════════════╝ 
+0

我的表格还有一个'DATETIME'字段,虽然这里没有显示。使用您的查询,是否可以显示按月份分组的每个和? – enchance

+0

是的。您希望我通过将它们按月分组来修改哪个查询? –

+0

您写的第一个查询。 – enchance

0

如果你只有三个状态,并且要一排与交付的项目数,以及一个列有未交付+延迟的项目数,您可以使用此查询:

SELECT 
    CASE WHEN status = 'delivered' THEN status 
     ELSE 'undelivered+delayed' END status, 
    COUNT(*) cnt 
FROM 
    yourtable 
GROUP BY 
    CASE WHEN status = 'delivered' THEN status 
     ELSE 'undelivered+delayed' END