使用SELECT UNION并从一个表返回两列的输出

3 sql oracle union select

我正在创建一个查询,计算表格中男性和女性演员的数量.我目前的陈述是这样的:

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’);
Run Code Online (Sandbox Code Playgroud)

输出最终是:

Male Actors
-----------
          7
         21
Run Code Online (Sandbox Code Playgroud)

我希望输出看起来像:

Male Actors   Female Actors
-----------   -------------
          7              21
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种替代方案,而不使用CASE WHEN或THEN条款.

提前感谢您的帮助.

Lam*_*mak 8

这样做:

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')
Run Code Online (Sandbox Code Playgroud)


ype*_*eᵀᴹ 8

另一种方式(没有CASE表达):

SELECT 
  ( SELECT COUNT(*)
    FROM tblActor 
    WHERE ActorGender = 'm' 
  ) AS MaleActors
, ( SELECT COUNT(*)
    FROM tblActor 
    WHERE ActorGender = 'f' 
  ) AS FemaleActors
FROM 
    dual ;
Run Code Online (Sandbox Code Playgroud)

和更多的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  ;
Run Code Online (Sandbox Code Playgroud)


Hel*_*ion 7

不使用案例的另一种方式:

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')
Run Code Online (Sandbox Code Playgroud)

应该导致

Male Actors    Female Actors
-----------    -------------
7              21 
Run Code Online (Sandbox Code Playgroud)


Tar*_*ryn 5

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

select *
from
(
  select actorgender
  from tblActor
) src
pivot
(
  count(actorgender)
  for actorgender in ('m' MaleActors, 'f' FemaleActors)
) piv
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

结果将是:

| MALEACTORS | FEMALEACTORS |
-----------------------------
|          4 |            5 |
Run Code Online (Sandbox Code Playgroud)

或者您可以使用a 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
Run Code Online (Sandbox Code Playgroud)