1.層次化遞歸查詢實現行轉列
如果市公司下面的供電所有一個指標作弊,則市公司該指標得0分。
select t1.c_org_no,/n t1.c_org_name,/n t1.ym,/n t1.zb_id,/n t1.zbz,/n CASE/n WHEN ',' || t2.zb_id like '%' || t1.zb_id || '%' THEN/n 0/n ELSE/n t1.df/n END df,/n t1.tj_type/n from (select t.* from tablename t where t.ym = ' ym ') t1,/n (select x_org_no,/n --ltrim(max(sys_connect_by_path(zb_id, ',')), ',') as zb_id/n max(sys_connect_by_path(zb_id, ',')) as zb_id/n from (select x_org_no,/n zb_id,/n rn1,/n lead(rn1) over(partition by x_org_no order by rn1) rn2 from (/n select t.*, row_number() over(order by x_org_no) rn1 from (select distinct t.x_org_no, t.zb_id/n from zb_pj_s t/n where t.ym = ' ym '/n and t.isfake = '1'/n order by x_org_no) t) t2) tmp/n start with rn2 is null/n connect by rn2 = PRior rn1/n group by x_org_no) t2/n where t1.x_org_no = t2.x_org_no(+) 市公司下面是縣公司,縣公司下面是供電所,isfake='1'說明該供電所這項指標作弊語句分析:
select distinct t.x_org_no, t.zb_id/n from zb_pj_s t/n where t.ym = ' ym '/n and t.isfake = '1'/n order by x_org_no先給這個月作弊供電所的按縣公司和指標分組,按縣公司排序數據應該是這樣:
縣公司編號 指標編號
36451 1
36451 3
36451 5
36452 1
36452 2
36455 2
36455 7
然后
row_number() over(order by x_org_no) rn1給每個縣公司的的記錄賦予行號縣公司編號 指標編號 rn1
36451 1 1
36451 3 2
36451 5 3
36452 1 1
36452 2 2
36455 2 1
36455 7 2
再給出分組里行號的下一個行號
lead(rn1) over(partition by x_org_no order by rn1) rn2縣公司編號 指標編號 rn1 rn2
36451 1 1 2
36451 3 2 3
36451 5 3 null
36452 1 1 2
36452 2 2 null
36455 2 1 2
36455 7 2 null
在從rn2為null開始分層次遞歸查詢把查詢的路徑中某個字段用逗號連接起來
sys_connect_by_path(zb_id, ',') as zb_id/nstart with rn2 is null/n connect by rn2 = prior rn1/n group by x_org_no) t2/nx_org_no zb_id
36451 5,3,1
36452 2,1
36455 7,2
實現了行轉列。
然后判斷某指標如果被包含其中,則得0分CASE/n WHEN ',' || t2.zb_id like '%' || t1.zb_id || '%' THEN/n 0/n ELSE/n t1.df/n END df,/n2.MySQL實現rank() over()功能
候選人排行得分情況統計:SELECT obj_new.rank, obj_new.candidate, obj_new.count, obj_new.scoreFROM ( SELECT obj.candidate, obj.count, obj.score, @rownum := @rownum + 1 AS rownum, @incrnum := CASE WHEN @rowtotal = obj.score THEN @incrnum WHEN @rowtotal := obj.score THEN @rownum END AS rank FROM ( SELECT candidate, count(*) count, SUM(t.score) score FROM t_vote_temp t WHERE t.type = '3' GROUP BY t.candidate ORDER BY score DESC ) AS obj, ( SELECT @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0 ) r ) AS obj_new3.根據字段的不同數據值進行統計
SELECT max(t.voter_name) voter_name,--投票人 max(t.voter_orgname) voter_orgname,--單位 SUM( CASE WHEN t.type = '1' THEN 1 ELSE 0 END ) aa, --獎項類型是1投了多少人 SUM( CASE WHEN t.type = '2' THEN 1 ELSE 0 END ) bb, --獎項類型是2投了多少人 SUM( CASE WHEN t.type = '3' THEN 1 ELSE 0 END ) cc --獎項類型是2投了多少人 FROM t_vote_temp t GROUP BY t.voter
新聞熱點
疑難解答