【问题标题】:Select multiple fields from subquery从子查询中选择多个字段
【发布时间】:2014-12-07 07:14:44
【问题描述】:

我有下一个问题:

SELECT
    a.Date,
    (SELECT SUM(Used), SUM(Max) FROM Switch_Statistic b WHERE Date = (SELECT MAX(Date) FROM Switch_Statistic WHERE Switch_ID = b.Switch_ID AND Date <= a.Date))
FROM Switch_Statistic a
GROUP BY Date;

如您所见,我需要从子查询中选择 SUM(Used), SUM(Max)。用CONCAT 不是很好的解决方案!


表架构:

ID --- Switch_ID --- Date --- Max --- Used

一些数据:

1   641 2014-10-04  2   16
20  630 2014-10-04  1   7
24  634 2014-10-04  0   8
26  641 2014-10-06  2   16
32  641 2014-10-07  2   16
35  641 2014-10-08  3   16
39  641 2014-10-09  2   16
64  293 2014-10-10  1   22
...
557 38  2014-10-12  3   22
559 293 2014-10-12  1   22
563 294 2014-10-12  6   22
565 641 2014-10-12  2   16

我需要什么: CONCAT_WS 示例

mysql> SELECT
    a.Date,
    (SELECT CONCAT_WS('/', SUM(Used), SUM(Max)) FROM Switch_Statistic b WHERE Date = (SELECT MAX(Date) FROM Switch_Statistic WHERE Switch_ID = b.Switch_ID AND Date <= a.Date)) AS Result
FROM Switch_Statistic a
GROUP BY Date;
+------------+----------+
| Date       | Result   |
+------------+----------+
| 2014-10-04 | 3/31     |
| 2014-10-06 | 3/31     |
| 2014-10-07 | 3/31     |
| 2014-10-08 | 4/31     |
| 2014-10-09 | 3/31     |
| 2014-10-10 | 249/1587 |
| 2014-10-11 | 354/2147 |
| 2014-10-12 | 360/2185 |
+------------+----------+
8 rows in set (0.26 sec)

查询逻辑: 1)从表中选择所有日期 2) SUM - 当前日期的已用和最大值,如果 Switch_ID 没有该日期的记录,则选择表中存在的最后一个

链接到 sqlfiddle - http://sqlfiddle.com/#!2/c3d479

【问题讨论】:

  • 您能否分享您的表格结构、一些示例数据以及您想要实现的目标?
  • 那么你的问题是什么??
  • 编辑您的问题并添加您想要的结果。

标签: mysql sql


【解决方案1】:

您应该能够只使用聚合而不使用子查询或连接来做到这一点:

  SELECT date, sum(used) as used, sum(max) as max
  FROM switch_statistic ss
  where ss.date = (select max(date) from Switch_Statistics ss2 where ss2.Switch_id = ss.SwitchId
  GROUP BY ss.date;

编辑:

您似乎想要一个累积的总和。在 MySQL 中,这通常最好使用变量来完成:

SELECT date, used, max, (@u := @u + used) as cumeused, @m := @m + max) as cumemax
fROM (SELECT date, sum(used) as used, sum(max) as max
      FROM switch_statistic ss
      GROUP BY ss.date
     ) ss CROSS JOIN
     (SELECT @u := 0, @m := 0) vars
ORDER BY date;

【讨论】:

  • cumeused, cumeused 显示为 null,结果也不正确。您的查询逻辑有点错误,请查看我的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多