SQL語句 分組統計問題


統計各個年齡階段的人數和性別

select
         ageGroup  as '年齡段'
       , cont(*)   as '人數'
       , sex       as '性別'
from
         (
                select
                       case
                              when age      >=1
                                     and age<=10
                                     then '1-10'
                              when age      >=11
                                     and age<=20
                                     then '11-20'
                              when age      >=21
                                     and age<=30
                                     then '21-30'
                              when age      >=31
                                     and age<=40
                                     then '31-40'
                                     else 'other'
                       end as ageGroup
                     , uname
                     , sex
                from
                       table
         )
         t
group by
         ageGroup
       , sex

統計各個年齡人數占百分比

SELECT
         USER_AGE 年齡
       , COUNT(USER_AGE) 人數
       , CAST(CAST((COUNT(USER_AGE)/(
         (
                SELECT
                       COUNT(*)
                FROM
                       WORKER
         )
         *1.0)*100) AS DECIMAL(9,2)) AS VARCHAR)+'%' 所占比例
FROM
         WORKER
GROUP BY
         USER_AGE

postgresql統計

  • 統計每小時的數量
    思路: 格式化時間保留到小時,然后使用concat拼接00分00秒
SELECT
         COUNT(id)                                            cnt
       , CONCAT(to_char(create_time,'yyyy-mm-dd hh24'),':00:00') H
FROM
         table a
GROUP BY
                  CONCAT(to_char(create_time,'yyyy-mm-dd hh24'),':00:00')
ORDER BY
         H
  • 每隔5秒統計一次
    比如01秒、04秒統一標識為00秒,05、06、09秒統一標識為05秒
    思路: 截取秒最后一位和5進行比較
SELECT
         tmp.newTime
       , tmp.name
       , COUNT(1) totalNum
FROM
         (
                  SELECT
                           t.id
                         , t.name
                         , t.create_time oldTime
                         , -- 原來的時間
                           CASE
                                    WHEN SUBSTR(to_char(t.create_time,'yyyy-mm-dd hh24:mi:ss'),19,1)::integer <5
                                             THEN CONCAT(SUBSTR(to_char(t.create_time,'YYYY-mm-dd hh24:mi:ss'),0,19),'0')
                                             ELSE CONCAT(SUBSTR(to_char(t.create_time,'yyyy-mm-dd hh24:mi:ss'),0,19),'5')
                           END AS newTime -- 時間段偽列
                  FROM
                           table t
                  ORDER BY
                           create_time ASC
         )
         tmp
GROUP BY
         tmp.newTime
       , tmp.name


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM