【问题标题】:Select more than one row inside sub query or evade sub query在子查询中选择多行或避开子查询
【发布时间】:2017-04-25 01:02:59
【问题描述】:

我想知道如何实现查询,它选择按clientid列分组的时间列WHERE子句从同一个表中除以月份和部门:

表格如下:

这里的目标是得到如下的最终结果:

结果 1.0

------------------------------
clientid | december| february
------------------------------
1        | 2:20    | 4:00
------------------------------
2        | 4:00    | 7:00
------------------------------ 

结果会以如下方式显示:

<table>
  <thead>
    <tr>
      <th>Clientes</th>
      <th>January</th>
      <th>February</th>                                                         
    </tr>
</thead>
<tbody>
<?php foreach($stmt as $row)
{   
echo"
<tr>
  <td>".$row['clientid']."</td>
  <td>".$row['january']."</td>
  <td>".$row['february']."</td>                               
</tr>"; }; ?>              
</tbody>
</table>  

在以下情况下的查询场景:

SELECT t.clientid, t.department, 
                        (SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `time` ) ) ) FROM time_management WHERE YEAR(date)='$year' AND MONTH(date)= 12 AND department = '$department' GROUP by clientid  ) as january,
                        (SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `time` ) ) ) FROM time_management WHERE YEAR(date)='$year' AND MONTH(date)= 2 AND department = '$department' GROUP by clientid ) as february
                        FROM time_management t WHERE t.department = '$department' GROUP by t.clientid

我收到错误:SQLSTATE[21000]: 基数违规:1242 子查询返回超过 1 行

由于子查询返回不止一行。

在子查询中没有 GROUP BY 的结果如下:

1   06:20:00    11:00:00                                            
2   06:20:00    11:00:00

所以我的问题是如何构造查询以获得在 result 1.0

中显示的所需结果

非常欢迎任何帮助。谢谢!

【问题讨论】:

  • 有多年的你想怎么处理?所有 12 月都设置为 1 月,所有 2 月都设置为 2 月,甚至跨越数年?
  • MySQL pivot table的可能重复
  • 您正在尝试执行的操作称为“数据透视表”。不幸的是 MySQL 似乎没有内置支持(与其他一些数据库不同),链接的问题有一些关于如何解决 PIVOT 缺失的信息。

标签: php mysql sql


【解决方案1】:

试试这个:

SELECT SUM( CASE WHEN MONTH(`date`) = 2 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS February,
       SUM( CASE WHEN MONTH(`date`) = 12 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS December
FROM time_management
WHERE t.department = '$department'
GROUP BY clientid

【讨论】:

    【解决方案2】:

    不需要使用子查询。您可以使用条件聚合:

    SELECT SUM( CASE WHEN MONTH(`date`) = 2 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS February,
           SUM( CASE WHEN MONTH(`date`) = 12 THEN TIME_TO_SEC( `time` )  ELSE 0 END) AS December
    FROM time_management
    WHERE t.department = '$department'
    GROUP BY clientid
    

    这样您可以计算一年中每个月的SUMtime

    【讨论】:

    • 您在第一个查询中有错字吗? 2而不是12?还是故意的?
    • 想法是同时选择2个月。二月和十二月。这种情况会只选择两个月中的一个吗?
    • @davejal 2 用于February,而12 用于December。由于 OP 中提供的示例数据,我已将这几个月包括在内
    • @JohnSiniger 每个CASE 计算一个月的SUM。您可以将12 单独包含在CASES 中,以便计算每个月的SUM
    • @JohnSiniger 使用SEC_TO_TIME
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多