mysql中的聚合查询问题

wfveoks0  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(383)

在表格中给出以下数据:

RIDER_ID, DEST1, DEST2, DEST3

 '864', '387', '24', NULL

 '864', '24', '1', NULL

 '864', '732', '1', NULL

以及以下声明:

SELECT DISTINCT(RIDER_ID), DEST1, DEST2, DEST3, 

(CASE WHEN START_DATE BETWEEN '2018-11-01 00:00:00' AND ' 2018-11-01 23:59:59 ' THEN  COUNT(DEST1) + COUNT( DEST2) + COUNT(DEST3) END) AS '2018-11-01',
(CASE WHEN START_DATE BETWEEN '2018-11-02 00:00:00' AND ' 2018-11-02 23:59:59 ' THEN  COUNT(DEST1) + COUNT( DEST2) + COUNT(DEST3) END) AS '2018-11-02'

FROM SCHEDULE

WHERE START_DATE BETWEEN '2018-11-01 00:00:00' AND '2018-11-02 23:59:59' AND RIDER_ID = 864

GROUP BY START_DATE, RIDER_ID, DEST1, DEST2, DEST3

结果如下:

RIDER_ID, 2018-11-01, 2018-11-02

 '864', '2', NULL

 '864', '2', NULL

 '864', NULL, '2'

然而,我想要的是:

RIDER_ID, 2018-11-01, 2018-11-02

 '864', '4', '2'

所以第864号车手在第一天一共有4个目的地,第二天有2个目的地。当然,每个月的每一天和每个车手id都会有专栏。
换句话说,每个车手id只有一条记录,其中日期列包含目的地的总数。字段中的值是索引值,在这里无关紧要。只需计算是否有值(即每个车手的id和日期的目的地总数)。
到目前为止,我还没有想出正确的说法。啊。

sqyvllje

sqyvllje1#

我认为只要从字段列表和groupby子句中删除dest1、dest2、dest3,就应该得到想要的结果。
distinct(附加id)没有用,因为您已经在按该字段分组。
但是,即使结构略有不同,您也可能会得到类似的结果:

SELECT RIDER_ID, DATE(START_DATE) AS DATE_START,
COUNT(DEST1) + COUNT( DEST2) + COUNT(DEST3) AS RIDES
FROM SCHEDULE
WHERE START_DATE BETWEEN '2018-11-01 00:00:00'
AND '2018-11-02 23:59:59' AND RIDER_ID = 864
GROUP BY RIDER_ID, DATE_START;

这将以以下格式返回数据:

RIDER_ID, DATE_START, RIDES
'864', '2018-11-01', 4
'864', '2018-11-02', 2
esyap4oy

esyap4oy2#

对于条件聚合,通常需要聚合函数中的条件,如下所示:

SELECT RIDER_ID
   , SUM(CASE WHEN START_DATE BETWEEN '2018-11-01 00:00:00' AND ' 2018-11-01 23:59:59 ' 
              THEN IF(DEST1 IS NULL,0,1) + IF(DEST2 IS NULL,0,1) + IF(DEST3 IS NULL,0,1) 
         END) AS `2018-11-01`
   , SUM(CASE WHEN START_DATE BETWEEN '2018-11-02 00:00:00' AND ' 2018-11-02 23:59:59 ' 
              THEN IF(DEST1 IS NULL,0,1) + IF(DEST2 IS NULL,0,1) + IF(DEST3 IS NULL,0,1) 
         END) AS `2018-11-02`
FROM SCHEDULE
WHERE START_DATE BETWEEN '2018-11-01 00:00:00' AND '2018-11-02 23:59:59' 
   AND RIDER_ID = 864
GROUP BY RIDER_ID
;

另外,在写这个的时候,我注意到sum可能更适合你想要的。
旁注: CASE 它比 IF() ,并且可以嵌套。为了使例子更清楚,我使用了if。

相关问题