【问题标题】:sql query with sum or column带有总和或列的sql查询
【发布时间】:2013-02-06 19:12:36
【问题描述】:

我有一个表格 color_balls 条目如下

=====================================================
Name    Red_Ball    Green_Ball  Yellow_Ball     
=====================================================
John       27           56          66
Mathew     37           45          15
=====================================================

我想写一个 sql 或 mysql 查询来得到如下输出。

=====================================
Color_of_Balls      No_of_balls
=====================================
Red_Ball            64
Green_Ball          101
Yellow_Ball         81
=====================================

【问题讨论】:

  • 你使用的是mysql还是oracle10g(都被标记了)?
  • 如果我在 sql 和 oracle10g 中都获得查询会很有帮助。查询在 sql anl 和 oracle10g 中都有效吗?
  • 以下查询适用于两者。 Oracle 有一个独特的解决方案,它不适用于 MySQL - 见下文。

标签: mysql sql oracle10g


【解决方案1】:

这种类型的查询称为 UNPIVOT,遗憾的是 MySQL 本身并不支持这种查询。但是,您可以使用 UNION 进行模拟:

SELECT 'Red_Ball' AS Color_of_Balls, SUM(Red_Ball) as No_of_Balls
FROM color_balls
UNION ALL
SELECT 'Green_Ball', SUM(Green_Ball)
FROM color_balls
UNION ALL
SELECT 'Yellow_Ball', SUM(Yellow_Ball)
FROM color_balls

Oracle10g 本身也不支持这个,虽然有this workaround

【讨论】:

  • union allunion 要好得多,因为你知道没有重复。
  • @GordonLinoff:已记录并更新。不过在这里可能没什么大不了的:)
【解决方案2】:

这应该适用于 Oracle 和 MySQL:

SELECT b.Color_of_Balls
     , CASE b.Color_of_Balls 
         WHEN 'Red_Ball'    THEN d.sum_red_ball
         WHEN 'Green_Ball'  THEN d.sum_green_ball
         WHEN 'Yellow_Ball' THEN d.sum_yellow_ball
       END AS No_of_balls
  FROM ( SELECT 'Red_Ball' AS Color_of_Balls FROM DUAL 
         UNION ALL SELECT 'Green_Ball' FROM DUAL
         UNION ALL SELECT 'Yellow_Ball' FROM DUAL
       ) b
 CROSS
  JOIN ( SELECT SUM(c.Red_Ball)    AS sum_red_ball
              , SUM(c.Green_Ball)  AS sum_green_ball
              , SUM(c.Yellow_Ball) AS sum_yellow_ball
           FROM color_balls c
       ) d
 ORDER
    BY CASE b.Color_of_Balls 
         WHEN 'Red_Ball'    THEN 1
         WHEN 'Green_Ball'  THEN 2
         WHEN 'Yellow_Ball' THEN 3
       END

请注意,这种方法只需要通过color_balls 表一次,而不是通过三个单独的表通过表(或更多,取决于您需要返回多少行。)

【讨论】:

  • LEFT JOIN 需要一个连接条件。但也许您的意思是 CROSS JOIN (不期望条件)?
  • 很好,安德烈。如果我包含一个评估为 true 的虚拟 ON 子句(在 MySQL 和 Oracle 中),例如 LEFT JOIN 也可以工作。 ON 1=1.
猜你喜欢
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多