MySQL報表和數(shù)據(jù)倉庫[11題]

原始表如下:


emp

dept

第1題,12.2變換結(jié)果集成多行

例:你想把行變換成列敛瓷,需要的結(jié)果不止一行学赛,你希望返回每個員工和他們的職位
(此類題型與日歷生成類似年堆,日歷可以format自動生成用來group by的列,此處只能自己生成盏浇,該題還與下方第6題類似)

需要最終結(jié)果:

答:

#步驟1:生成rnk列变丧,最最關(guān)鍵
create table x as
select e.job, e.ename, (select count(*) from emp d 
                         where e.job=d.job and e.empno<d.empno) as rnk
from emp e
order by 1,3
#步驟2:形成要求的格式
select max(case when job='CLERK' then ename end) as CLERK,
       max(case when job='ANALYST' then ename end) as ANALYSTS,
       max(case when job='MANAGER' then ename end) as MGRS,
       max(case when job='PRESIDENT' then ename end) as PREZ,
       max(case when job='SALESMAN' then ename end) as SALES
from x
group by rnk

(精髓是rnk的形成)
步驟1結(jié)果:


步驟1

第2題,12.3反向轉(zhuǎn)換結(jié)果集(列變成行)

例:想把列數(shù)據(jù)變?yōu)樾袛?shù)據(jù)绢掰,分兩步

需要最終結(jié)果:
第一步結(jié)果:

第二步結(jié)果:


答:

#步驟1:
create table x as
select sum(case when deptno=10 then 1 else 0 end) as deptno_10,
       sum(case when deptno=20 then 1 else 0 end) as deptno_20,
       sum(case when deptno=30 then 1 else 0 end) as deptno_30
from emp
#步驟2:
select dept.deptno, case when deptno=10 then x.deptno_10
                         when deptno=20 then x.deptno_20
                         when deptno=30 then x.deptno_30
                    end as count_by_dept
from x, (select distinct deptno from dept where deptno<=30 order by 1) dept

第3題痒蓬,12.7創(chuàng)建固定大小的數(shù)據(jù)桶

例:你希望基于EMPNO值為EMP表里的員工分組,一組最多5人(桶的數(shù)量不限制滴劲,但每個桶最多裝5個數(shù)據(jù))

需要最終結(jié)果:

答:

select ceil(rnk/5) as grp, empno ename
from (select e.empno, e.ename, (select count(*) from emp d where e.empno < d.empno)+1 as rnk
                                from emp e) x
      order by grp

(此處count(*) 必須從0開始攻晒,否則要用floor(rnk/5)要出問題的)

第4題,12.8創(chuàng)建預(yù)定數(shù)目的桶

例:你希望把EMP表中的員工分別放入到4個桶里面(桶的數(shù)量一定班挖,里面裝多少數(shù)據(jù)可變)

需要最終結(jié)果:

答:

select mod(count(*),4)+1 as grp, e.empno, e.ename
from emp e, emp d
where e.empno>=d.empno
group by e.empno, e.ename
order by 1

第5題鲁捏,12.9創(chuàng)建水平直方圖

例:希望以水平直方圖的形式顯示每個部門的員工人數(shù),用'*'代表一個員工

需要最終結(jié)果:

答:

select deptno, lpad('',count(*),'*') as cnt
from emp
group by deptno

第6題萧芙,12.10創(chuàng)建垂直直方圖

例:希望以垂直直方圖的形式顯示每個部門的員工人數(shù)给梅,用'*'代表一個員工

需要最終結(jié)果:

答:

#步驟1:形成rnk列,最最關(guān)鍵
create table x as
select  case when e.deptno=10 then '*' end deptno_10,
        case when e.deptno=20 then '*' end deptno_20,
        case when e.deptno=30 then '*' end deptno_30,
        (select count(*) from emp d where e.deptno=d.deptno and e.empno<d.empno) as rnk
from emp e
order by 4,3,2,1
#步驟2:按照要求的格式排列
select max(deptno_10) as d10,
       max(deptno_20) as d20,
       max(deptno_30) as d30
from x
group by rnk
order by 1 ,2 ,3 

(最后的排序双揪,可能不同的數(shù)據(jù)庫不一樣动羽,可以升序降序都試一下,按照自己的喜好來)

步驟1結(jié)果:


步驟1

第7題渔期,12.11返回非分組列

例:希望找出每個部門工資最高和最低的員工运吓,同時也找出每個職位對應(yīng)的工資最高和最低的員工

需要最終結(jié)果:

答:

#步驟1:
create table y as
select e.deptno, e.ename, e.job, e.sal,
       (select max(sal) from emp d where d.deptno = e.deptno) as maxdept,
       (select max(sal) from emp d where d.job = e.job) as maxjob,
       (select min(sal) from emp d where d.deptno = e.deptno) as mindept,
       (select min(sal) from emp d where d.job = e.job) as minjob
from emp e
#步驟2:
select deptno, ename, job, sal,
       case when sal=maxdept then 'top_sal_in_dept'
            when sal=mindept then 'low_sal_in_dept'
       end as dept_status,
       case when sal=maxjob then 'top_sal_in_job'
            when sal=minjob then 'low_sal_in_job'
       end as dept_status
from y
where sal in (maxdept,mindept,maxjob,minjob)
order by 1

步驟1結(jié)果:


步驟1

第8題,12.12計算簡單的小計

例:希望得到一個結(jié)果集疯趟,既包含了EMP表各個JOB對應(yīng)的工資合計值拘哨,也包括全部工資的總計

需要最終結(jié)果:

答:

select coalesce(job,'total') job, sum(sal) sal
from emp
group by job with rollup

第9題,12.17按照時間單位分組

例:你有一些交易日志迅办,希望每隔5秒?yún)R總一下這些數(shù)據(jù)

生成交易日制表trx_log1:

create table trx_log (TRX_ID int,
                      TRX_DATE DATETIME(6),
                      TRX_CNT INT)
insert into trx_log values (1,'2005-07-28 19:03:07',44),
                           (2,'2005-07-28 19:03:08',18),
                           (3,'2005-07-28 19:03:09',23),
                           (4,'2005-07-28 19:03:10',29),
                           (5,'2005-07-28 19:03:11',27),
                           (6,'2005-07-28 19:03:12',45),
                           (7,'2005-07-28 19:03:13',45),
                           (8,'2005-07-28 19:03:14',32),
                           (9,'2005-07-28 19:03:15',41),
                           (10,'2005-07-28 19:03:16',15),
                           (11,'2005-07-28 19:03:17',24),
                           (12,'2005-07-28 19:03:18',47),
                           (13,'2005-07-28 19:03:19',37),
                           (14,'2005-07-28 19:03:20',48),
                           (15,'2005-07-28 19:03:21',46),
                           (16,'2005-07-28 19:03:22',44),
                           (17,'2005-07-28 19:03:23',36),
                           (18,'2005-07-28 19:03:24',41),
                           (19,'2005-07-28 19:03:25',33),
                           (20,'2005-07-28 19:03:26',19)
create trx_log1 as
select TRX_ID, date_format(TRX_DATE,'%d-%b-%Y %T') as TRX_DATE ,TRX_CNT
from trx_log

交易日制表trx_log1如下圖所示:


需要最終結(jié)果:

答:

select ceil(trx_id/5)as grp,
       min(trx_date) as trx_start,
       max(trx_date) as trx_end,
       sum(trx_cnt) as total
from trx_log1
group by ceil(trx_id/5)

第10題宅静,12.18多維度聚合運算

例:希望得到一個結(jié)果集章蚣,包括每個員工的姓名站欺、部門、他所在部門的員工總數(shù)(包括他自己)纤垂、和他做相同工作的員工總數(shù)(包括他自己)矾策,以及EMP表中的員工總?cè)藬?shù)

需要最終結(jié)果:

答:

select e.ename,
       e.deptno,
       (select count(*) from emp d where d.deptno=e.deptno) as deptno_cnt,
       job,
       (select count(*) from emp d where d.job=e.job) as job_cnt,
       (select count(*) from emp ) as total
from emp e

第11題,12.9動態(tài)區(qū)間聚合運算

例:希望把入職最早的員工的hiredate作為起點峭沦,每隔90天計算一次工資合計值贾虽。想調(diào)查一下,在最早入職的員工和最近入職的員工之間每隔90天工資的波動狀況

需要最終結(jié)果:

答:

select e.hiredate, e.sal,
       (select sum(sal) from emp d 
        where d.hiredate between e.hiredate-90 and e.hiredate) as spending_pattern
from emp e
order by 1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吼鱼,一起剝皮案震驚了整個濱河市蓬豁,隨后出現(xiàn)的幾起案子绰咽,更是在濱河造成了極大的恐慌,老刑警劉巖地粪,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件取募,死亡現(xiàn)場離奇詭異,居然都是意外死亡蟆技,警方通過查閱死者的電腦和手機玩敏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來质礼,“玉大人旺聚,你說我怎么就攤上這事】艚叮” “怎么了砰粹?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長造挽。 經(jīng)常有香客問我伸眶,道長,這世上最難降的妖魔是什么刽宪? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任厘贼,我火速辦了婚禮,結(jié)果婚禮上圣拄,老公的妹妹穿的比我還像新娘嘴秸。我一直安慰自己,他們只是感情好庇谆,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布岳掐。 她就那樣靜靜地躺著,像睡著了一般饭耳。 火紅的嫁衣襯著肌膚如雪串述。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天寞肖,我揣著相機與錄音纲酗,去河邊找鬼。 笑死新蟆,一個胖子當(dāng)著我的面吹牛觅赊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琼稻,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吮螺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鸠补,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤萝风,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后紫岩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闹丐,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年被因,在試婚紗的時候發(fā)現(xiàn)自己被綠了卿拴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡梨与,死狀恐怖堕花,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粥鞋,我是刑警寧澤缘挽,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站呻粹,受9級特大地震影響壕曼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜等浊,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一腮郊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筹燕,春花似錦轧飞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至制妄,卻和暖如春掸绞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耕捞。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工衔掸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人砸脊。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓具篇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凌埂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. 了解SQL 1.1 數(shù)據(jù)庫基礎(chǔ) ? 學(xué)習(xí)到目前這個階段诗芜,我們就需要以某種方式與數(shù)據(jù)庫打交道瞳抓。在深入學(xué)習(xí)MyS...
    鋒享前端閱讀 1,066評論 0 1
  • 引出 ?請思考如下問題埃疫? –查詢所有員工的每個月工資總和,平均工資孩哑? –查詢工資最高和最低的工資是多少栓霜? –查詢公...
    C_cole閱讀 7,288評論 0 3
  • 目標(biāo) 聚合函數(shù) 分組函數(shù) 子查詢 多行子查詢 引出 ?請思考如下問題? –查詢所有員工的每個月工資總和横蜒,平均工資胳蛮?...
    wqjcarnation閱讀 4,150評論 0 6
  • 期末考試臨近了,進入了激烈緊張的復(fù)習(xí)階段.復(fù)習(xí)無非于讀讀寫寫背背丛晌,做卷子成了孩子們每天必備的重要課程仅炊。課下寫...
    肖慶娜閱讀 236評論 0 0
  • 大學(xué)畢業(yè)的時候,為了逃避父母讓回老家就業(yè)的“追逼”澎蛛,參加完畢業(yè)典禮就拉著行李箱“逃”到了三亞抚垄。四十多個小時蜷縮在...
    愛笑的麥芽芽閱讀 225評論 0 0