Mysql 带和或列的sql查询
我有一张表,颜色如下Mysql 带和或列的sql查询,mysql,sql,oracle10g,Mysql,Sql,Oracle10g,我有一张表,颜色如下 ===================================================== Name Red_Ball Green_Ball Yellow_Ball ===================================================== John 27 56 66 Mathew 37 45 15 ====
=====================================================
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
=====================================
这种类型的查询称为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本机也不支持这一点,尽管有。这应该在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\u balls
表,而不是三次单独通过表(或更多,取决于需要返回的行数)。您使用的是mysql还是oracle10g(两者都有标记)?如果我同时获得sql和oracle10g中的查询,这将很有帮助。查询是否同时在sql anl和oracle10g中工作?下面的查询将同时适用于这两种查询。Oracle有一个独特的解决方案,它不适用于MySQL-请参见下文。union all
比union
更可取,因为您知道没有重复的解决方案。@GordonLinoff:注意并更新了。但在这里可能没什么关系:)LEFT JOIN需要一个连接条件。但也许你的意思是交叉连接(这不需要条件)?接得好,安德烈。如果我包括一个计算结果为true的dummy ON子句(在MySQL和Oracle中),例如ON 1=1
,那么左连接也可以工作。