根据性别条件计算(*)

时间:2013-05-14 10:28:23

标签: sql oracle10g

我在oracle10g中有下表。

   state     gender   avg_sal   status
    NC           M      5200     Single 
    OH           F      3800     Married
    AR           M      8800     Married
    AR           F      6200     Single
    TN           M      4200     Single
    NC           F      4500     Single

我试图根据某些条件形成以下报告。该报告应如下所示。我尝试了下面的查询,但count(*)没有按预期工作

state     gender no.of males no.of females   avg_sal_men      avg_sal_women
 NC           M       10            0           5200                 0
 OH           F        0            5           0                  3800
 AR           M        16           0           8800                  0
 AR           F        0            12          0                  6200
 TN           M        22            0          4200                  0
 NC           F        0             8          0                   4500

我尝试了以下查询,但我无法根据男性和女性的数量进行统计。

    select State, "NO_OF MALES", "$AVG_sal", "NO_OF_FEMALES", "$AVG_SAL_FEMALE"
    from(
    select State,
    to_char(SUM((CASE WHEN gender = 'M' THEN average_price ELSE 0 END)),'$999,999,999') as "$Avg_sal_men,
     to_char(SUM((CASE WHEN gender = 'F' THEN average_price ELSE 0 END)), '$999,999,999') as "$Avg_sal_women,
     (select count (*) from table where gender='M')"NO_OF MALES",
    (select count (*) from table where gender='F')"NO_OF_FEMALES"
     from table group by State order by state);

3 个答案:

答案 0 :(得分:1)

您可以使用case作为表达式(您已经知道......)。子查询是不必要的。

select State
     , sum(case gender when 'M' then 1 else 0 end) as "no.of males"
     , sum(case gender when 'F' then 1 else 0 end) as "no.of females"
     , to_char(
           SUM(
               (
                   CASE
                   WHEN gender = 'M' THEN average_price
                   ELSE 0
                   END
               )
           )
         , '$999,999,999'
       ) as "Avg_sal_men",
       to_char(SUM((CASE WHEN gender = 'F' THEN average_price ELSE 0 END))
              ,'$999,999,999'
     ) as "Avg_sal_women"
from table
group by State;

答案 1 :(得分:0)

您正在通过此子查询select count (*) from table where gender='M'进行计数,该查询总是计算整个表中男性的总数....并且您在计算女性时也这样做... 所以你可以尝试这样......

select State, "NO_OF MALES", "$AVG_sal", "NO_OF_FEMALES", "$AVG_SAL_FEMALE"
        from(
        select State,
        to_char(SUM((CASE WHEN gender = 'M' THEN average_price ELSE 0 END)),'$999,999,999') as "$Avg_sal_men",
         to_char(SUM((CASE WHEN gender = 'F' THEN average_price ELSE 0 END)), '$999,999,999') as "$Avg_sal_women,
        Sum(Case when gender='M' then 1 else 0 end) "NO_OF MALES",
         Sum(Case when gender='F' then 1 else 0 end) "NO_OF_FEMALES"
         from table group by State order by state);

答案 2 :(得分:0)

请尝试以下操作。

select state
      ,sum(case when gender = 'M' then 1 else 0 end)      as nof_males
      ,sum(case when gender = 'F' then 1 else 0 end)      as nof_females
      ,avg(case when gender = 'M' then average_price end) as avg_sal_male
      ,avg(case when gender = 'F' then average_price end) as avg_sal_female
  from table
 group 
    by state;

..根据需要添加格式。

相关问题