【问题标题】:Use GROUP_CONCAT in MySQL with considering null在 MySQL 中使用 GROUP_CONCAT 并考虑 null
【发布时间】:2012-10-25 00:51:09
【问题描述】:

我有一个包含 3 个字段的表格。该表记录了过去 30 天内每天到相关国家/地区的通话时长。

C_Date      Country         C_Time  
2012-10-01  India           1316
2012-10-01  USA             12  
2012-10-01  UK              132     
2012-10-01  Kuwait          134     
2012-10-02  UK              135     
2012-10-02  USA             136     
2012-10-02  Singapore       137     

我需要使用这些记录生成一个表和一个折线图,我尝试编写 MySQL 查询。基本上我只需要为选定的国家绘制这个。
假设我想要印度、美国和英国;那么我需要像这样拉一个记录集:

C_Date     | Calling_Time
-----------+----------------------------------
2012-10-01 | 1316,12,132
2012-10-02 | 0,136,135
2012-10-03 | ...
...        | ...

这是我的查询:

SELECT C_Date, GROUP_CONCAT(C_Time
ORDER BY Country
SEPARATOR ',') as Calling_Time
FROM Call_Table t
WHERE Country
IN ('India', 'USA', 'UK')
GROUP BY C_Date
ORDER BY  C_Date

结果更接近,但它忽略了空结果。

C_Date     | Calling_Time
-----------+----------------------------------
2012-10-01 | 1316,12,132
2012-10-02 | 136,135   (expected 0,136,135)

我可以更改我的查询以获得像 0,136,135 或 ,136,135 或 null,136,135 这样的 Calling_Time 吗?(具有唯一的段数代表每个国家)

提前致谢!

【问题讨论】:

    标签: mysql concat group-concat


    【解决方案1】:

    试试这个查询 -

    SELECT
      C_Date,
      CONCAT(MAX(IF(country = 'India', C_Time, 0)), ',',
             MAX(IF(country = 'USA', C_Time, 0)), ',',
             MAX(IF(country = 'UK', C_Time, 0))) Calling_Time
      FROM call_table
      GROUP BY C_Date
    
    +------------+--------------+
    | C_Date     | Calling_Time |
    +------------+--------------+
    | 2012-10-01 | 1316,12,132  |
    | 2012-10-02 | 0,136,135    |
    +------------+--------------+
    

    【讨论】:

      【解决方案2】:
      SELECT   aa.C_Date, 
               GROUP_CONCAT(COALESCE(bb.C_Time,0) ORDER BY bb.Country) Calling_Time
      FROM
      (
          SELECT a.Country, b.C_DATE
          FROM
                ( 
                    SELECT DISTINCT Country
                    FROM TableName t
                    WHERE Country IN ('India', 'USA', 'UK')
                ) a CROSS JOIN
                (
                    SELECT DISTINCT DATE(C_Date) C_Date
                    FROM TableName t    
                ) b
      ) aa LEFT JOIN TableName bb
           ON aa.Country = bb.Country AND
              aa.C_DATE = DATE(bb.C_DATE)
      GROUP BY aa.C_Date
      

      【讨论】:

        猜你喜欢
        • 2021-02-24
        • 2023-03-29
        • 2012-06-04
        • 2014-03-09
        • 2019-06-22
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 2012-09-30
        相关资源
        最近更新 更多