如何在sql中按两列分组?

ao218c7q  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(578)

我有两张table,一张是“活动”,第二张是“门票”:
事件表:

============================
| event_id |   event_name  |
============================
|   101    | Running Event |
|   102    | Cycling Event |
============================

票务表:

==============================================================
| ticket_id | event_id | ticket_number | ticket_generate_date|
==============================================================
|    1      |    101   |    40001      |  2018-08-21 17:05   |
|    2      |    101   |    40002      |  2018-08-21 18:05   |
|    3      |    102   |    40001      |  2018-08-21 19:05   |
|    4      |    101   |    40003      |  2018-08-23 20:05   |
|    5      |    101   |    40004      |  2018-08-24 20:05   |
==============================================================

现在我想运行query,这样我的输出如下所示:

================================================
| count ticket |   event_name  | day wise data |
================================================
|       2      | Running Event |  2018-08-21   |
|       1      | Cycling Event |  2018-08-21   |
|       1      | Running Event |  2018-08-23   |
|       1      | Running Event |  2018-08-24   |
================================================

我尝试了以下查询:

SELECT COUNT(ticket_id), ticket_generate_date FROM Tickets 
WHERE ticket_generate_date >= DATE_FORMAT(curdate(), '%Y-%m-01') 
GROUP BY DATE_FORMAT(ticket_generate_date, '%d-%b');
bprjcwpo

bprjcwpo1#

如果在 group by 在这种情况下,我选择了 event_name 最终的输出或多或少和预期的一样。要输出所请求的所有详细信息,尽管您需要连接两个表(或使用嵌套的select)

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| event_id   | int(11)     | NO   |     | NULL    |       |
| event_name | varchar(50) | NO   |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

+----------------------+-----------+------+-----+-------------------+----------------+
| Field                | Type      | Null | Key | Default           | Extra          |
+----------------------+-----------+------+-----+-------------------+----------------+
| id                   | int(11)   | NO   | PRI | NULL              | auto_increment |
| event_id             | int(11)   | NO   |     | 0                 |                |
| ticket_number        | int(11)   | NO   |     | 0                 |                |
| ticket_generate_date | timestamp | NO   |     | CURRENT_TIMESTAMP |                |
+----------------------+-----------+------+-----+-------------------+----------------+

select 
    count( t.id ) as 'sales',
    e.`event_name` as `event`,
    date_format( t.`ticket_generate_date`, '%y-%m-%d' ) as `day wise data`
from `tickets` t
    join `events` e on e.`event_id`=t.`event_id`
where t.`ticket_generate_date` >= date_format( curdate(), '%y-%m-01' )
group by e.event_name, date_format( t.`ticket_generate_date`, '%d-%b' );

+-------+---------------+---------------+
| sales | event         | day wise data |
+-------+---------------+---------------+
|     1 | Cycling event | 18-08-21      |
|     2 | Running Event | 18-08-21      |
|     1 | Running Event | 18-08-23      |
|     1 | Running Event | 18-08-24      |
+-------+---------------+---------------+

或者,为了进一步细化结果,您可以按日期排序

select 
    count( t.id ) as 'sales',
    e.`event_name` as `event`,
    date_format( t.`ticket_generate_date`, '%y-%m-%d' ) as `day wise data`
from `tickets` t
    join `events` e on e.`event_id`=t.`event_id`
where t.`ticket_generate_date` >= date_format( curdate(), '%y-%m-01' )
group by e.event_name, date_format( t.`ticket_generate_date`, '%d-%b' )
order by `day wise data`;

+-------+---------------+---------------+
| sales | event         | day wise data |
+-------+---------------+---------------+
|     2 | Running Event | 18-08-21      |
|     1 | Cycling event | 18-08-21      |
|     1 | Running Event | 18-08-23      |
|     1 | Running Event | 18-08-24      |
+-------+---------------+---------------+
bpsygsoo

bpsygsoo2#

您只需要在已有的选项中添加第二个group选项,并使用逗号。
我还使用别名和内部连接来获取事件名称。

SELECT 
    COUNT(t.ticket_id),
    e.event_name,
    DATE_FORMAT(t.ticket_generate_date, '%Y-%m-%d') as day_wise
FROM 
    Tickets t
INNER JOIN
    Events e ON e.event_id = t.event_id
WHERE 
    t.ticket_generate_date >= DATE_FORMAT(curdate(), '%Y-%m-01') 
GROUP BY 
    DATE_FORMAT(t.ticket_generate_date, '%Y-%m-%d'), e.event_name

它在这里工作:http://sqlfiddle.com/#!9/b235c/1/0

vnzz0bqm

vnzz0bqm3#

试试这个:

select sum(ticket)id) ticket_count
       (select event_name from Events where event_id = t.event_id) event_name,
       cast(ticket_generate_date as date)
from Tickets t
group by event_id, cast(ticket_generate_date as date)

相关问题