【问题标题】:How to count multiple things in 1 column如何在 1 列中计算多个事物
【发布时间】:2014-08-05 17:48:21
【问题描述】:

我有一张桌子empnameagegender

     empname   age    gender
     Nana      24       F
     Jillian   28       M
     Sally     29       F
     David     30       M
     Mike      35       M
     Daisy     37       F

问题是我如何从名为employee 的表中计算女性30、男性30 的性别

     female<30  female>30  male<30  male>30
         2          1         1        2

【问题讨论】:

    标签: sql


    【解决方案1】:

    最简单的方法是使用多个子查询:

    SELECT
    (SELECT COUNT(*) FROM employee WHERE gender = F AND age<30) AS 'Female Below 30',
    (SELECT COUNT(*) FROM employee WHERE gender = F AND age>=30) AS 'Female Above 30',
    (SELECT COUNT(*) FROM employee WHERE gender = M AND age<30) AS 'Male Below 30',
    (SELECT COUNT(*) FROM employee WHERE gender = M AND age>=30) AS 'Male Above 30'
    

    我认为在这种情况下使用 PIVOT 更好:

    SELECT  [FB30],
            [FA30],
            [MB30],
            [MA30]
    FROM    (
                SELECT  empname, 
                        gender + CASE WHEN age<30 THEN 'B30' ELSE 'A30' END AS SexAge 
                FROM    Employee
            ) AS SourceTable
            PIVOT
            (
                COUNT(empname)
                FOR SexAge IN ([FB30],[FA30],[MB30],[MA30])
            ) AS PivotTable;
    

    看看这个SQL SERVER Fiddle Demo

    经过一番搜索(我没有进入 Oracle ......)我最终得到了 PIVOT:

    WITH
       T
    AS
    (
        SELECT "empname" ,
               "gender" || CASE WHEN "age"<30 THEN 'B30' ELSE 'A30' END AS "SexAge"
        FROM  Employee
    )
    SELECT
       SUM(FB30) AS FB30,SUM(FA30) AS FA30,SUM(MB30) AS MB30,SUM(MA30) AS MA30
    FROM
       T
    PIVOT
    (
       COUNT(*)
       FOR
          ("SexAge")
       IN
          ('FB30' AS FB30,'FA30' AS FA30,'MB30' AS MB30,'MA30' AS MA30)
    );
    

    Oracle PIVOT Demo

    既然您要求提供DECODE 示例:

    WITH
       T
    AS
    (
        SELECT "empname" ,
               "gender" || DECODE(TRUNC("age"/30),0,'B30','A30') AS "SexAge"
        FROM  Employee
    )
    SELECT
       SUM(FB30) AS FB30,SUM(FA30) AS FA30,SUM(MB30) AS MB30,SUM(MA30) AS MA30
    FROM
       T
    PIVOT
    (
       COUNT(*)
       FOR
          ("SexAge")
       IN
          ('FB30' AS FB30,'FA30' AS FA30,'MB30' AS MB30,'MA30' AS MA30)
    );
    

    Oracle DECODE PIVOT Demo

    【讨论】:

    • 这个工作正常,但我需要把不同的,所以数据不会重复
    • 你想要Distinct在哪里?
    • 没关系。我们可以使用 decode 作为解决方案吗?
    • 你在Oracle吗?您要使用DECODE 代替大小写吗?
    • 是的,我在Oracle,我想找到其他方法来获得结果
    【解决方案2】:

    你可以这样查询:

    select
      count(case when gender='F' and age >= 30 then 1 end) "Female>=30",
      count(case when gender='F' and age < 30 then 1 end) "Female<30",
      count(case when gender='M' and age >= 30 then 1 end) "Male>=30",
      count(case when gender='M' and age < 30 then 1 end) "Male>30"
    from ...
    

    您可以只阅读一次表格以获得您想要的结果。当表很大时,这可能会有很大的不同。

    【讨论】:

    • 为什么要放1?如果我把 0 它也工作了
    • 您可以输入除null 之外的任何值。 count 函数计数不是空值。
    【解决方案3】:

    请尝试:

    select
        sum(case when gender='F' and age<30 then 1 end) [female<30],
        sum(case when gender='F' and age>=30 then 1 end) [female>30],
        sum(case when gender='M' and age<30 then 1 end) [male<30],
        sum(case when gender='M' and age>=30 then 1 end) [male>30]
    from
        tbl
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      SELECT  SUM(CASE
                     WHEN gender = "F" and age < 30
                     THEN 1
                     ELSE 0
              END ) AS female_lt_30
      ,
              SUM(CASE
                     WHEN gender = "F" and age >= 30
                     THEN 1
                     ELSE 0
              END ) AS female_ge_30
      ,
              SUM(CASE
                     WHEN gender = "M" and age < 30
                     THEN 1
                     ELSE 0
              END ) AS male_lt_30
      ,
              SUM(CASE
                     WHEN gender = "M" and age >= 30
                     THEN 1
                     ELSE 0
              END ) AS female_ge_30
      
      FROM the_table;
      

      【讨论】:

        猜你喜欢
        • 2018-02-17
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        相关资源
        最近更新 更多