1. 程式人生 > >SQL查詢語句行轉列橫向顯示

SQL查詢語句行轉列橫向顯示

示例一、

表資料:
表資料
查詢結果:
結果
方法一:

SELECT 
    t.name, 
    (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm1' AND h.name = t.name) m1,
    (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm2' AND h.name = t.name) m2,
    (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm3' AND h.name = t.name) m3
FROM
test2 t GROUP BY t.name

方法二:

SELECT 
    t.name, 
    SUM(CASE WHEN t.mold='m1' THEN t.amount END) m1,
    SUM(CASE WHEN t.mold='m2' THEN t.amount END) m2,
    SUM(CASE WHEN t.mold='m3' THEN t.amount END) m3
FROM test2 t
GROUP BY t.name

例項二、

表資料:
表資料
查詢結果:
查詢結果

-- 靜態SQL,指課程只有語文、數學、英語這三門課程。

方法一:

SELECT 
    t.name,
    MAX(CASE t.course WHEN '語文' THEN t.score ELSE 0 END) yw,
    MAX(CASE t.course WHEN '數學' THEN t.score ELSE 0 END) sx,
    MAX(CASE t.course WHEN '英語' THEN t.score ELSE 0 END) yy
FROM test3 t
GROUP BY t.name

方法二:

SELECT 
    t.name,
    SUM(IF(course = '語文', score, 0)) yw,
    SUM
(IF(course = '數學', score, 0)) sx, SUM(IF(course = '英語', score, 0)) yy FROM test3 t GROUP BY t.name

建表語句及資料:

CREATE TABLE `test2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL COMMENT '名字',
  `mold` varchar(32) DEFAULT NULL COMMENT '型別',
  `amount` int(11) DEFAULT NULL COMMENT '數量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

insert into `test2` (`id`, `name`, `mold`, `amount`) values('1','小白','m1','1');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('2','小白','m2','2');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('3','小白','m3','3');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('4','小黑','m1','4');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('5','小黑','m2','5');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('6','小白','m1','6');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('7','小白','m3','7');
insert into `test2` (`id`, `name`, `mold`, `amount`) values('8','小黑','m3','1');
CREATE TABLE `test3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `course` varchar(32) DEFAULT NULL COMMENT '課程',
  `score` int(11) DEFAULT NULL COMMENT '成績',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into `test3` (`id`, `name`, `course`, `score`) values('1','小白','語文','99');
insert into `test3` (`id`, `name`, `course`, `score`) values('2','小白','數學','88');
insert into `test3` (`id`, `name`, `course`, `score`) values('3','小白','英語','84');
insert into `test3` (`id`, `name`, `course`, `score`) values('4','小黑','語文','89');
insert into `test3` (`id`, `name`, `course`, `score`) values('5','小黑','數學','95');
insert into `test3` (`id`, `name`, `course`, `score`) values('6','小黑','英語','98');

相關推薦

SQL查詢語句橫向顯示

示例一、 表資料: 查詢結果: 方法一: SELECT t.name, (SELECT SUM(h.amount) FROM test2 h WHERE h.mold = 'm1' AND h.name = t.nam

SQL查詢語句中行顯示

示例1: select country, sum(case when type='A' then money end) as A, sum(case when type='B' then money end) as B, sum(case when type='C

關於MySQL中查詢語句分組的問題

今天遇到一個SQL的小問題,首先需要按天查詢資料,並且需要統計每一個不同位置的資料條數,處理的時候卡住了,特此記錄一下: #首先,第一次寫的SQL如下,先按天分組,後按指定條件分組: SELECT id, DATE_FORMAT(crea

Oracle 動態SQL實現SQL查詢子集

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

sql查詢結果, 有多少多少

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

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

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

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

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

SQL 統計 欄位 豎向橫向顯示

在做一些SQL統計時,為了更直觀看到結果,並進行比較,需要把豎向表的部分統計欄位轉成橫向顯示。 原資料格式: wbname        newstime ------------------------------ 瀟湘晨報        直播報道 佛山日報後天 揚子晚

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 ([語文],[數學],[外語],[

Mysql 轉行統計查詢統計查詢

- ---------------------------- -- Table structure for `TabName` -- ---------------------------- DROP TABLE IF EXISTS `TabN

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

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

oracle 查詢結果

工作中遇到了這麼一個情況:sql查詢結果,查出來需要遍歷才能取到想要的結果 SELECT LAYER_CODE,GROUP_NAME FROM BS_CHNGROUP_DICT START WITH GROUP_ID = '10809' CONNECT

SQL pivot(),unpivot(轉行)

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

老生常談之SQL Server (轉行)

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

sql語句中的 查詢

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

T-sql ,數據庫查詢分頁

tput substr between dep and alt rom img lec 1 USE [APS_Future_FT] 2 GO 3 /****** Object: StoredProcedure [dbo].[A_CrudePrice] Scr

SQL語句實現

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

查詢每個學生每門課程的成績,sql server實現

本人經常寫sql server指令碼,有時需要行轉列,這裡做個筆記。 練習指令碼 -- 學生表 CREATE TABLE student ( stuid VARCHAR(16) NOT NULL, stunm VARCHAR(20) NOT NULL, PRI

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

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

HIVE 查詢顯示列名 及 顯示

hive預設查詢不會顯示列名, 當一個表字段比較多的時候,往往看不出值與列之間的對應關係,對日常查錯及定位問題帶來不便,應同事要求,看了HIVE CLI原始碼,做了下些許調整, 加入列頭列印及行轉列顯示功能 未開啟行轉列功能之前: hive>>> sele