1. 程式人生 > >mysql sql語句:行轉列問題

mysql sql語句:行轉列問題

存在表score,記錄學生的考試成績,如下圖所示:

                

現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示

                

具體步驟如下:

1、首先,使用case when函式輸出單個課程的成績

case when course='語文' then score end as 語文

case when course='數學' then score end as 數學

case when course='英語' then score end as 英語

sql語句:

select name ,case when course='語文' then score end as 語文,

case when course='數學' then score end as 數學,

case when course='英語' then score end as 英語  from score;

輸出結果如下圖所示:

                

2、使用group by 和sum,去掉NULL得出課程的成績

sql語句:

select name ,sum(case when course='語文' then score end) as 語文,
sum(case when course='數學' then score end )as 數學,
sum(case when course='英語' then score end )as 英語
from score group by name;

輸出結果如下圖所示

                

就得出行轉列的輸出結果了

總結:在具體的生活場景中,使用學生姓名,課程1,課程2,課程3……的表結構是不太合理的,比如選修課,不可能每個學生都選一樣的課程,這種結構會存在浪費儲存空間的情況,比較好的做法就是一行表示一個學生的某個課程的成績,再使用行轉列方法輸出想要的成績結構。


相關推薦

mysql sql語句問題

存在表score,記錄學生的考試成績,如下圖所示:                現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示                具體步驟如下:1、首先,使用case when函式輸出單個課程的成績case when co

SQL語句實現

within sel 11g wm_concat 進行 com 10g 本地測試 from 最近在維護一個項目,出現了一下bug需要進行調試,於是把正式庫上面的代碼搬到本地庫上面,數據庫是本地的,跑項目的時候調試發現代碼裏面帶有wmsys.wm_concat函數的SQL語句

Databricks 第11篇Spark SQL 查詢(轉行、Lateral View、排序)

本文分享在Azure Databricks中如何實現行轉列和列轉行,並介紹對查詢的結果進行排序的各種方式。 一,行轉列 在分組中,把每個分組中的某一列的資料連線在一起: collect_list:把一個分組中的列合成為陣列,資料不去重,格式是['a','a','b'] collect_set:把一個分組中的

PIVOT函數

sco 課程 計算列 格式 ... str logs sub .com PIVOT函數,行轉列 PIVOT函數的格式如下: PIVOT(<聚合函數>([聚合列值]) FOR [行轉列前的列名] IN([行轉列後的列名1],[行轉列後的列名2],[行轉列後的列名3

sql pivot() 和unpivot(轉行)的用法

sql clas 數據 sele core unp null col style 1、PIVOT用法(行轉列) select * from Table_Score as a pivot (sum(score) for a.name in ([語文],[數學],[外語],[

awk 處理文字轉行

  [[email protected] ~]# cat f 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 51 2 3 4 5   awk '{for(i=1;i<=NF;i++)a[NR,i]=$i}END{for(j

Oracle 技巧總結(一)

1.行轉列 oracle中行轉列 語法結構select listagg(column1, ',') within group(order by column2) from X;  如下圖所示: listagg(attr1, attr2):第一個引數是要行轉列的那個欄位

SQL Server 動態(引數化表名、分組欄位、欄位值)

一.本文所涉及的內容(Contents) 二.背景(Contexts)   其實行轉列並不是一個什麼新鮮的話題了,甚至已經被大家說到爛了,網上的很多例子多多少少都有些問題,所以我希望能讓大家快速的看到執行的效果,所以在動態列的基礎上再把表、分組欄位、行轉列欄位、值這四個行轉列固定需要的值變成真正意義的

VBA 使用Excel資料庫

最近工作中有需求,要從Excel表中提取一些統計資訊,因為需求變動可能比較頻繁,所以用VBA來做了。除錯資料操作部分頗費周折,特記錄一下。 1.資料來源檔案:[D:\4月份統計表.xlsx]: 2.最終的統計表格式: 3.計算規則: 要求: A. 外觀等級A,且WLD

Oracle 動態SQL實現SQL查詢子集

引言 我們都知道Oracle的Pivot的In()裡是不能跟SQL查詢語句的,必須是已知的字串結果,然而我專案中遇到的需求這個In 並不是靜態的,而是根據我傳遞的條件來篩選,一開始想的是解析XML,可惜轉為XML之後,有相同的重複的節點,解析太麻煩,於是想通過

SQL pivot(),unpivot(轉行)

【pivot】行轉列:多行變一列 假設學生成績表Score1 Name Subject Score 小張 語文 88 小花 數學 89 小張

使用pivot和unpivot語句實現,轉行

在做報表時,經常需要將資料表中的行轉列,或者列轉行,如果不知道方法,你會覺得通過SQL語句來實現非常難。這裡,我將使用pivot和unpivot來實現看似複雜的功能。 引用MSDN: 可以使用 PIVOT 和 UNPIVOT 關係運算符將表值表示式更改為另一個表。PIVOT

老生常談之SQL Server (轉行)

1 --靜態的行轉列 2 --新建一個科目成績表 3 --三個欄位:學生名稱,科目,成績 4 CREATE TABLE SubjectScore 5 ( 6 StuName nvarchar(20), 7 SubjectName nvarchar(20), 8 F

Mysql遞迴及,並優化

建立遞迴函式,根據專案rootId 找到其所有子專案 最終返回 以“,”連線在一起的子專案id串     DROP FUNCTION IF EXISTS `queryChilProject`;   CREATE DEFINER = `root`@`%` FUNCTION `

sql查詢結果, 有多少多少

普通行列轉換 問題:假設有張學生成績表(tb)如下: 姓名 課程 分數 張三 語文 74 張三 數學 83 張三 物理 93 李四 語文 74 李四 數學 84 李四 物理 94 想變成(得到如下結果):  姓名 語文 數學 物理  ---- ---- ---- ----

SQLdecode函式

  前言   開發中我們經常會用到行轉列,這裡記錄一下我在專案中實現行轉列的思路。需求:報表模組,統計某機房機架的不同狀態(1 空閒  2 預佔  3 佔用)的數量(真實需求更為複雜,這裡只是討論技術,簡化一下)     decode函式   以下介紹摘自百度百科:  

sql語句中的 查詢

有時候多行資料需要一行顯示,  這就需要行轉列的sql啦.    首先  ,要知道 行轉列當然是要以某個欄位進行分組的,然後再根據表中  一個欄位的值做轉列後的欄位名,  這個值所對應的另一個欄位作為  值    示例: 表名: XX班 班級 學生 身高

SQL資料庫查詢實現轉行結果SQL語句

 CREATETABLE[StudentScores](    [UserName]NVARCHAR(20),        --學生姓名[Subject]NVARCHAR(30),        --科目[Score]FLOAT,               --成績)INSERTINTO[StudentS

Oracle pivot 、轉行unpivot 的Sql語句總結

多行轉字串 這個比較簡單,用||或concat函式可以實現 print? 1.  select concat(id,username) str from app_user   2.     3.  select id||username str from app_use

Mysql-sql

原始資料如下圖所示:(商品的銷售明細)date=業務日期;Item=商品名稱;saleqty=銷售數量 -- 建立測試資料(表)create table test (Date varchar(10), item char(10),saleqty int);insert test values('2010