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
=====================================
4

2 に答える 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 もこれをネイティブにサポートしていません。

于 2013-02-06T19:19:18.607 に答える
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テーブルを 3 回個別に通過するのではなく、テーブルを 1 回通過するだけでよいことに注意してください (返される必要がある行の数によっては、それ以上になります)。

于 2013-02-06T20:37:44.513 に答える