2016-02-06 42 views
2

我有一个查询,我一直在努力了一段时间,但我似乎无法得到它。这里的其他答案适用于计算某个日期范围内的金额,然后按日期分组以获得计数。不过,我需要按日期对两列进行计数和分组。MySQL日期范围多列计数和按选择语句分组

比如这里是我试图去工作查询:

(SELECT COUNT(*) arrived, DATE(arrived) date, 'arrived' AS source 
FROM products 
WHERE arrived BETWEEN '2016-01-01' AND '2016-01-31' 
GROUP BY DATE(date) 
ORDER BY date ASC) 

UNION ALL 

(SELECT COUNT(*) released, DATE(released) date, 'released' AS source 
FROM products 
WHERE released BETWEEN '2016-01-01' AND '2016-01-31' 
GROUP BY DATE(date) 
ORDER BY date ASC) 

然而,这返回如下:

arrived date  source 
3  2016-01-12 arrived 
2  2016-01-28 arrived 
1  2016-01-29 arrived 
1  2016-01-05 released 

我所需要的是这样的:

date   arrived released 
2016-01-05  0   1 
2016-01-12  3   0 
2016-01-28  2   0 
2016-01-29  1   0 

有什么建议吗?谢谢。

回答

2

你可以申请有条件聚集由一个UNION ALL操作所获得的派生表“到达”和“释放”日期:

SELECT `date`, 
     COUNT(CASE WHEN type = 'arrived' THEN 1 END) AS arrived, 
     COUNT(CASE WHEN type = 'released' THEN 1 END) AS released 
FROM (
    SELECT arrived AS `date`, 'arrived' as type 
    FROM products 
    WHERE arrived BETWEEN '2016-01-01' AND '2016-01-31' 

    UNION ALL 

    SELECT released AS `date`, 'released' as type 
    FROM products 
    WHERE released BETWEEN '2016-01-01' AND '2016-01-31') AS t 
GROUP BY `date` 

Demo here

+0

谢谢你,除了一两件事,工程,它会将当天发布的东西拉到抵达日期。例如,在2016-01-05当我发布1个物品时,它会显示1个物品已发布,0个物品已到达,就像我想要的那样。然而,对于发布的该项目,它将显示其到达日期(2015-10-04),而不是其发布日期(2016-01-05)。这当然是因为你把日期(抵达)日期,这将抓住到达日期。有没有什么办法可以是DATE(到达)或DATE(已发布),以便抓取正确的日期? – Ethan

+0

@Ethan是的,你是对的。我误解了你的表的模式。让我重新构造查询以适应表格的真实架构。 –

+0

完美!谢谢! – Ethan