【问题标题】:Using SELECT UNION and returning output of two columns from one table使用 SELECT UNION 并从一个表中返回两列的输出
【发布时间】:2012-11-15 13:29:13
【问题描述】:

我正在创建一个查询表中男性和女性演员的数量。我现在的说法是这样的:

Select COUNT(ActorGender) “Male Actors” 
from (tblActor ta WHERE ta.ActorGender in(‘m’)
UNION
Select COUNT(ActorGender) “Female Actors” 
from tblActor ta 
WHERE ta.ActorGender in(‘f’);

输出结果是:

Male Actors
-----------
          7
         21

我希望输出看起来像:

Male Actors   Female Actors
-----------   -------------
          7              21

我正在寻找一种替代方法来解决此问题不使用 CASE WHEN 或 THEN 子句

提前感谢您一如既往的帮助。

【问题讨论】:

    标签: sql oracle select union


    【解决方案1】:

    这样可以:

    SELECT  COUNT(CASE WHEN ActorGender = 'm' THEN 1 ELSE NULL END) MaleActors,
            COUNT(CASE WHEN ActorGender = 'f' THEN 1 ELSE NULL END) FemaleActors
    FROM tblActor 
    WHERE ActorGender IN ('m','f')
    

    【讨论】:

    • 谢谢您,先生,工作就像一个魅力。我只希望在不使用 CASE WHEN 子句的情况下有一个替代方法......
    • @learnenburn 有,你可以使用PIVOT,但是对于两个元素,我觉得大小写更容易
    • @Lamak PIVOT 仅当它是 Oracle 11g+ 时才能使用,您必须使用您的版本。 :)
    • @bluefeet 你说得对,我的评论更像是邀请你写下所说的答案,实际上 ;-)
    • @Lamak 你问,我回答。 :)
    【解决方案2】:

    另一种方式(不带CASE 表达式):

    SELECT 
      ( SELECT COUNT(*)
        FROM tblActor 
        WHERE ActorGender = 'm' 
      ) AS MaleActors
    , ( SELECT COUNT(*)
        FROM tblActor 
        WHERE ActorGender = 'f' 
      ) AS FemaleActors
    FROM 
        dual ;
    

    CROSS 加入更多解决方案:

    SELECT m.MaleActors, f.FemaleActors
    FROM 
      ( SELECT COUNT(*) AS MaleActors
        FROM tblActor 
        WHERE ActorGender = 'm' 
      ) m
      CROSS JOIN
      ( SELECT COUNT(*) AS FemaleActors
        FROM tblActor 
        WHERE ActorGender = 'f' 
      ) f  ;
    

    【讨论】:

    • MySQL 5.7.23 上的第一个查询也可以在没有结尾 "FROM DUAL" 的情况下工作
    • @MarcoDemaio 正确。这个问题被标记为 Oracle (不是 mysql)
    • @ypercubeᵀᴹ 我知道,我给了你+1,我只是添加一般感兴趣的信息:-)
    【解决方案3】:

    另一种不使用大小写的方法:

    select sum(males) as "Male Actors", sum(females) as "Female Actors" 
    from 
    (select count(actorGender) as Males, 0 as Females
    from tblActor 
    where actorGender = 'm'
    union all
    select 0 as males, count(actorGender) as Females
    from tblActor
    where actorGender = 'f')
    

    应该会导致

    Male Actors    Female Actors
    -----------    -------------
    7              21 
    

    【讨论】:

    • 很好的解决方法,我遇到了类似的问题,我需要将两个不相关的查询合并到两个相邻的列中......非常好的解决方法:P......我已经发疯了,而且就是这么简单!
    【解决方案4】:

    如果您使用的是Oracle 11g+,那么您可以使用PIVOT

    select *
    from
    (
      select actorgender
      from tblActor
    ) src
    pivot
    (
      count(actorgender)
      for actorgender in ('m' MaleActors, 'f' FemaleActors)
    ) piv
    

    SQL Fiddle with Demo

    结果是:

    | MALEACTORS | FEMALEACTORS |
    -----------------------------
    |          4 |            5 |
    

    或者您可以使用CROSS JOIN 来获得相同的结果:

    select m.MaleActors, f.FemaleActors
    from 
    (
      select count(ActorGender) MaleActors, 'm' Gender
      from tblActor
      where ActorGender = 'm'
    ) m
    cross join
    (
      select count(ActorGender) FemaleActors, 'f' Gender
      from tblActor
      where ActorGender = 'f'
    ) f
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 2016-06-18
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      相关资源
      最近更新 更多