記一次複雜sql寫法 ,mysql 動態行轉列

2021-09-26 22:06:59 字數 1740 閱讀 5862

需求 將t_program **的豎行,轉向成橫行,在t_result**裡面展示出來

直接上sql

set @sql = null;

select

group_concat(

distinct concat(

'max(if(r.program_id = ''',

p.id,

''', r.value, 0)) as ''',

p. name,

''''

)) into @sql

from

t_program p;

set @sql = concat('select

r.create_date as createdate,',@sql,',max(ah.warning_level) as warninglevel,

ah.id as id

from

t_air_result_high_risk ah

left join t_result r on ah.result_id = r.id

and r. enable = ''','y''

group by

r.create_date,

eq_id');

prepare stmt from @sql;

execute stmt;

deallocate prepare stmt;

主要分3個部分

第一部分:

select

group_concat(

distinct concat(

'max(if(r.program_id = ''',

p.id,

''', r.value, 0)) as ''',

p. name,

''''

)) into @sql

from

t_program p;

將表裡面所有符合條件的 查詢出來 ,這個查詢出來是乙個字串的形式

第二部分

拼接sql 語句 使用 concat() 函式 拼接自己想要的sql 語句

concat('select

r.create_date as createdate,',@sql,',max(ah.warning_level) as warninglevel,

ah.id as id

from

t_air_result_high_risk ah

left join t_result r on ah.result_id = r.id

and r. enable = ''','y''

group by

r.create_date,

eq_id');

如果直接使用 select @sql 的話 查詢出來的 還是乙個字串, 他沒有按照sql語句去執行

第三部分

將拼接出來的新的@sql 語句 執行

使用

prepare stmt from @sql;

execute stmt;

deallocate prepare stmt;

我也不清楚上面的語句是幹啥的,但是能夠將@sql 按照sql語句執行出來

記一次複雜查詢

專案中有乙個需求,查出使用者取出,充值次數,金額,使用者名稱,金幣的總量和每局遊戲的盈虧等做乙個統計,而他們分布在個表中,分別是使用者表,使用者取出表,使用者充值表,每局遊戲表中。首先想到的就是要分組查詢,group by user.userid.因為有的使用者有充值記錄但不一定有取出記錄,所以需要...

記一次sql查詢

效果圖 要查詢出如上圖的效果 知識點.1.多表巢狀查詢.2.輸出查詢結果,group concat函式 3.關聯查詢 select t1.學校,case when t1.年級 2017 then 1年級 when t1.年級 2016 then 2年級 when t1.年級 2015 then 3年...

記一次SQL優化

問題發生在關聯主表a 4w資料量 和副表b 4w資料量 關聯欄位都是openid 當時用的是 left join 直接跑sql,卡死 伺服器也是差 優化1 改left join 為join,兩者區別就是left join查詢時已主表為依據,該是幾條就幾條 就算副表沒有關聯的資料 join如果副表沒有...