表名(row_to_column)
表結構如下:
sql直接查詢即可得如上結果:select * from row_to_column
要達到查詢效果如下結構:
正解sql如下即可:
select name as "姓名",
max(case subject when "數學" then score end ) as "數學",
max(case subject when "語文" then score end ) as "語文",
max(case subject when "英語" then score end ) as "英語"
from row_to_column group by name
如果sql直接寫成如下,則會出現很多null
故進而可以根據姓名分組取每科最大的值,剛好每科最大的就是其真實分數,
如下sql試錯:
(個人理解)根據name分組,則name相同的只應該顯示一行,但是有可能name相同的存在有多行,mysql就不知道該顯示哪行了,就報錯了。因為正解sql裡面使用了max聚合函式,可以做到name相同的只顯示一行,就不會報錯了
擴充套件:mysql官網對group by的解說:
如果使用了group by ,select的字段必須是group by的字段,否則查詢在標準sql-92中是非法的
主要是sql模式啟用了only_full_group_by ,預設是啟用的,臨時關閉only_full_group_by方法如下:
select @@sql_mode;--先查詢出來,然後把查詢出來的字串去掉only_full_group_by再賦值回去
set @@global.sql_mode='';
set sql_mode ='strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_engine_substitution';
此時就可以查詢非group by的字段了
如上圖所示:關閉only_full_group_by 模式後,根據name分組查詢,name相同的存在多行,,查詢結果只顯示每個分組的第一行
mysql列邊行 mysql 行轉列 列轉行
group concat 函式說明 手冊上說明 該函式返回帶有來自乙個組的連線的非null值的字串結果 通俗點理解,其實是這樣的 group concat 會計算哪些行屬於同一組,將屬於同一組的列顯示出來。要返回哪些列,由函式引數 就是欄位名 決定。分組必須有個標準,就是根據group by指定的列...
邏輯行和物理行
物理行是你在編寫程式時所 看見 的。邏輯行是python 看見 的單個語句。python假定每個 物理行 對應一 個 邏輯行 邏輯行的例子如print hello world 這樣的語句 如果它本身就是一行 就像你在編輯器中看到的那樣 那麼它也是乙個物理行。預設地,python希望每行都只使用乙個語...
MySql列轉為行
前一天,在技術群有人提出乙個問題,如下圖所示 問第七題該這麼做?我研究了大概20分鐘左右,這是很典型的將列轉為行的sql。以下是主要步驟 第一步,我建立了表sales drop table ifexists sales create table sales year int 255 default ...