SQL查询使用SUM或列

4

我有一个名为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(两者都被标记了)? - PinnyM
如果我能获得sql和oracle10g中的查询,那将会很有帮助。这个查询语句在sql和oracle10g中都能使用吗? - Mohammed Selman
以下查询适用于两种数据库。Oracle有一种独特的解决方案,这种解决方案在MySQL上不起作用 - 请参见下文。 - PinnyM
2个回答

4

这种类型的查询被称为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本身也不支持此功能,不过有这个解决方法


1
当您知道没有重复项时,“union all”比“union”更可取。 - Gordon Linoff
@GordonLinoff:已注意并更新。但在这里可能不会有太大影响 :) - PinnyM

0

这应该适用于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(它不需要条件)? - Andriy M
很好的发现,Andriy。如果我包括一个在MySQL和Oracle中都评估为true的虚拟ON子句,例如ON 1=1,那么LEFT JOIN也可以起作用。 - spencer7593

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接