【问题标题】:how to group by two column in sql?如何在sql中按两列分组?
【发布时间】:2019-01-28 13:05:16
【问题描述】:

我有两张表,一张是“events”,第二张是“tickets”:

事件表:

============================
| 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   |
==============================================================

现在我想运行查询,以便我的输出如下所示:

================================================
| 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');

【问题讨论】:

  • 到目前为止,@Santosh,您尝试了什么?
  • 你有没有尝试过?有示例代码吗?
  • @Rafael 我试过这个查询 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')
  • Santosh,请将此添加到主要任务中,以便每个人都可以阅读。 :)

标签: php mysql mysqli


【解决方案1】:

您只需将第二组选项添加到您已有的选项中,并用逗号分隔。

我还使用了别名和 INNER JOIN 来获取事件名称。

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

【讨论】:

    【解决方案2】:

    如果您在 group by 子句中包含额外的列名 - 在这种情况下,我选择了 event_name,最终输出或多或少符合预期。要输出请求的所有详细信息,尽管您需要连接两个表(或使用嵌套选择)

    +------------+-------------+------+-----+---------+-------+
    | 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      |
    +-------+---------------+---------------+
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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)
      

      【讨论】:

        猜你喜欢
        • 2014-08-20
        • 2021-06-04
        • 2018-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        相关资源
        最近更新 更多