繁体   English   中英

带sum或列的sql查询

[英]sql query with sum or column

我有一个表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
=====================================

这种类型的查询称为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_balls表一次,而不是通过表三次单独传递(或更多,具体取决于您需要返回多少行)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM