Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带和或列的sql查询_Mysql_Sql_Oracle10g - Fatal编程技术网

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
,那么左连接也可以工作。