Sql 行轉列問題總結

1、行轉列---1、最簡單的行轉列
/*    問題:假設有張學生成績表(tb)如下:
姓名 課程 分數
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94想變成(得到如下結果): 
姓名 語文 數學 物理 
李四 74   84   94
張三 74   83   93
*/
--測試用
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int)
insert into tb values('張三' , '語文' , 74)
insert into tb values('張三' , '數學' , 83)
insert into tb values('張三' , '物理' , 93)
insert into tb values('李四' , '語文' , 74)
insert into tb values('李四' , '數學' , 84)
insert into tb values('李四' , '物理' , 94)
go--SQL SERVER 2000 動態SQL,指課程不止語文、數學、物理這三門課程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql) 
--通過動態構建@sql,得到如下腳本
select 姓名 as 姓名 ,max(case 課程 when '語文' then 分數 else 0 end) 語文,max(case 課程 when '數學' then 分數 else 0 end) 數學,max(case 課程 when '物理' then 分數 else 0 end) 物理
from tb
group by 姓名--SQL SERVER 2005 動態SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 課程 from tb group by 課程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')
--得到SQL SERVER 2005 靜態SQL。
select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b--查詢結果
/*
姓名         數學          物理          語文          
---------- ----------- ----------- ----------- 
李四         84          94          74
張三         83          93          74(所影響的行數為 2 行)
*/--2 加合計
/*
問題:在上述結果的基礎上加平均分,總分,得到如下結果:
姓名 語文 數學 物理 平均分 總分 
---- ---- ---- ---- ------ ----
李四 74   84   94   84.00  252
張三 74   83   93   83.33  250
*/--SQL SERVER 2000 靜態SQL。
select 姓名 姓名,max(case 課程 when '語文' then 分數 else 0 end) 語文,max(case 課程 when '數學' then 分數 else 0 end) 數學,max(case 課程 when '物理' then 分數 else 0 end) 物理,cast(avg(分數*1.0) as decimal(18,2)) 平均分,sum(分數) 總分
from tb
group by 姓名--SQL SERVER 2000 動態SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名'
exec(@sql) --SQL SERVER 2005 靜態SQL。
select m.* , n.平均分 , n.總分 from
(select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b) m,
(select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n
where m.姓名 = n.姓名--SQL SERVER 2005 動態SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 課程 from tb group by 課程
exec ('select m.* , n.平均分 , n.總分 from
(select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b) m , 
(select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n
where m.姓名 = n.姓名')
 
其他實例http://topic.csdn.net/u/20100708/18/55df5a90-27a7-4452-a69a-27f735539a1f.html?seed=24842417&r=66831902#r_66831902--3、不同數據按照序號轉為列,方法基本同 1if object_id('tb1') is not null drop table tb1
go
CREATE table tb1 --數據表
(
cpici varchar(10) not null,
cname varchar(10) not null,
cvalue int null 
)
--插入測試數據
INSERT INTO tb1 values('T501','x1',31)
INSERT INTO tb1 values('T501','x1',33)
INSERT INTO tb1 values('T501','x1',5)INSERT INTO tb1 values('T502','x1',3)
INSERT INTO tb1 values('T502','x1',22)
INSERT INTO tb1 values('T502','x1',3)INSERT INTO tb1 values('T503','x1',53)
INSERT INTO tb1 values('T503','x1',44)
INSERT INTO tb1 values('T503','x1',50)
INSERT INTO tb1 values('T503','x1',23)--在sqlserver2000里需要用自增輔助
alter table tb1 add id int identity
go
declare @s varchar(8000)
set @s='select cpici '
select @s=@s+',max(case when rn='+ltrim(rn)+' then cvalue end) as cvlue'+ltrim(rn)
from (select distinct rn from (select rn=(select count(1) from tb1 where cpici=t.cpici and id<=t.id) from tb1 t)a)t
set @s=@s+' from (select rn=(select count(1) from tb1 where cpici=t.cpici and id<=t.id),* from tb1 t
) t group by cpici'
 
exec(@s)
go
alter table tb1 drop column id --再2005就可以用row_number
declare @s varchar(8000)
set @s='select cpici '
select @s=@s+',max(case when rn='+ltrim(rn)+' then cvalue end) as cvlue'+ltrim(rn)
from (select distinct rn from (select rn=row_number()over(partition by cpici order by getdate()) from tb1)a)t
set @s=@s+' from (select rn=row_number()over(partition by cpici order by getdate()),* from tb1
) t group by cpici'
 
exec(@s)---結果
/*
cpici      cvlue1      cvlue2      cvlue3      cvlue4
---------- ----------- ----------- ----------- -----------
T501       31          33          5           NULL
T502       3           22          3           NULL
T503       53          44          50          23
警告: 聚合或其他 SET 操作消除了空值。(3 行受影響)*/--測試用
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
create table tb(電話號碼 varchar(15), 通話時長 int ,行業 varchar(10))
insert tb
select '13883633601', 10 ,'餐飲' union all
select '18689704236', 20 ,'物流' union all
select '13883633601', 20 ,'物流' union all
select '13883633601', 20 ,'汽車' union all
select '18689704236', 20 ,'醫療' union all
select '18689704236', 20 ,'it' union all
select '18689704236', 20 ,'汽車' union all
select '13883633601', 50 ,'餐飲'
godeclare @sql varchar(8000)
set @sql='select 電話號碼,sum(通話時長) 通話總和'
select @sql=@sql+',max(case when rowid='+ltrim(rowid)+' then 行業 else '''' end) as [行業'+ltrim(rowid)+']'
from (select distinct rowid from (select (select count(distinct 行業) from tb where 電話號碼=t.電話號碼 and 行業<=t.行業) rowid
from tb t) a) b
set @sql=@sql+' from ( select * , (select count(distinct 行業) from tb where 電話號碼=t.電話號碼 and 行業<=t.行業) rowid
from tb t ) t group by 電話號碼'
exec(@sql)--結果
/*(所影響的行數為 8 行)電話號碼            通話總和        行業1        行業2        行業3        行業4        
--------------- ----------- ---------- ---------- ---------- ---------- 
13883633601     100         餐飲         汽車         物流         
18689704236     80          it         汽車         物流         醫療(所影響的行數為 2 行)*/另一種動態行轉列:http://topic.csdn.net/u/20100612/10/4CFCB667-89FA-4985-90D5-B8A420A6FF12.htmlif object_id('[tb]') is not null drop table [tb]
go   
create table [tb]([姓名] varchar(1),[部門] varchar(4),[學歷] varchar(4),[出生年月] datetime)
insert [tb]
select 'A','后勤','高中','1986-1-1' union all
select 'B','后勤','初中','1984-3-7' union all
select 'C','管理','本科','1987-2-1' union all
select 'D','操作','專科','1976-2-1' union all
select 'E','操作','專科','1943-2-1'   
goGO
if object_id('GetGroupByCol') is not null drop proc GetGroupByCol
go
create  PROCEDURE [dbo].[GetGroupByCol]
@colm nvarchar(100)AS
declare @sql varchar(4000)set @sql='
declare @sql varchar(8000)
set @sql=''select 部門''
select @sql =@sql+ '', sum(case ltrim('+@colm+') when ''''''+ltrim(' + @colm + ')+'''''' then 1 else 0 end) 
[''+ltrim(' + @colm + ')+'']'' from (select distinct '+@colm+' from tb where '+@colm+' is not null) as a
set @sql = @sql + '' from tb group by 部門''
exec(@sql)'
 
exec(@sql)
GOexec GetGroupByCol N'學歷'
exec GetGroupByCol N'出生年月'
exec GetGroupByCol N'姓名'/*(所影響的行數為 5 行)部門   本科          初中          高中          專科          
---- ----------- ----------- ----------- ----------- 
操作   0           0           0           2
管理   1           0           0           0
后勤   0           1           1           0(所影響的行數為 3 行)部門   02  1 1943 12:00AM 02  1 1976 12:00AM 03  7 1984 12:00AM 01  1 1986 12:00AM 02  1 1987 12:00AM 
---- ------------------ ------------------ ------------------ ------------------ ------------------ 
操作   1                  1                  0                  0                  0
管理   0                  0                  0                  0                  1
后勤   0                  0                  1                  1                  0(所影響的行數為 3 行)部門   A           B           C           D           E           
---- ----------- ----------- ----------- ----------- ----------- 
操作   0           0           0           1           1
管理   0           0           1           0           0
后勤   1           1           0           0           0(所影響的行數為 3 行)
*/以下可參考的例子1、普通多表聯合http://topic.csdn.net/u/20100623/00/077055eb-784d-4b27-8407-2c17adc06c60.html?seed=81934135&r=66426155#r_66426155
 
http://topic.csdn.net/u/20100622/19/9710803c-441b-45d0-b010-703a2633fe89.html?471612、多表根據時間 計算序號
http://topic.csdn.net/u/20100623/12/bbb0921b-0e1b-4435-8e85-959d87844954.html?seed=2145286087&r=66438763#r_66438763
http://topic.csdn.net/u/20100701/09/1684649b-b893-463b-8b40-7f4b894cd41e.html?seed=205688256&r=66630774#r_666307743、財務相關
http://topic.csdn.net/u/20100626/00/83499112-43ae-4caa-a1fd-268cc5138da6.html?seed=415671352&r=66513615#r_665136154、根據行數轉列http://topic.csdn.net/u/20100705/12/e325571b-c368-4174-859f-17ae708eca3d.html
 
http://topic.csdn.net/u/20100706/09/c34728dc-6167-45df-b7cf-974612b9aa8b.html
 
http://topic.csdn.net/u/20100706/16/f217deed-a2be-4950-b911-2624ac7a881a.html?394455、根據排序大小轉http://topic.csdn.net/u/20100707/13/63f4a02e-ebc3-4c71-9380-d6b2ca0eb366.html?399706、分組排序按序號轉http://topic.csdn.net/u/20100725/05/7f813114-c423-4759-97b8-b22e1e2e90d7.html?seed=471594449&r=67220945#r_67220945
 本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xys_777/archive/2010/06/22/5685953.aspx

?

轉載于:https://www.cnblogs.com/douqiumiao/p/3406342.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259217.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

尋找第K大的數字

尋找第k大的數字&#xff0c;有很多方法&#xff0c;最基本的就是將數組按照從大到小的順序排列&#xff0c;找出第k個元素即可。但是這種方法的時間復雜度為o(nlog(n)),我們還能找到更好地方法。下面我們將介紹另外兩種辦法&#xff0c;一種是基于快排Partition的方法&#xf…

(12)MSP430F5529 常用內置函數和一些說明

&#xff08;1&#xff09; MSP430F5529支持最高工作頻率為25MHZ&#xff0c;也就是說你通過 鎖相環倍頻來提高系統運行速度是有一個限制的&#xff0c; 最高只能到25MHZ&#xff08;再高沒意思了&#xff09;。 &#xff08;2&#xff09;幾個重要的內聯函數 &#xff08;內聯…

從零開始學android編程_android初學者的入門秘籍

大概是去年年底開始接觸android原本是學習嵌入式的我&#xff0c;領導讓我看看能不能搞一下這個android APP。一開始的我懵逼得很。。。這android APP 不是得用java寫嗎&#xff1f;&#xff1f;&#xff1f; 現在我看網上說比較多還是用kotlin&#xff0c;沒去學。。。好家伙&…

修改了sql默認路徑無法登錄服務器,PostgreSQL錯誤'無法連接到服務器:沒有這樣的文件或目錄'...

像其他一些人一樣,當我在我的項目中運行rake db:migrate或者甚至為我的Ruby on Rails 3.2應用程序嘗試大多數數據庫任務時,我收到此錯誤.PGError(無法連接到服務器:沒有這樣的文件或目錄.服務器是否在本地運行并接受Unix域套接字上的連接"/tmp/.s.PGSQL.5432"&#x…

QMarkDowner編譯

第一次完整的編譯一個工程。哈哈 記錄一下 準備環境 我的環境是win7 x64, python2.7.5 x64的。 python 3.x的我沒試過,有需要的朋友可以試一下。 安裝python2.7.5 x64 確保將安裝路徑加入到Path中 PyQt4 啊 我的環境是win的 當然要下win版 (PyQt4-4.10.3-gpl-Py2.7-Qt4.8.5-x6…

C++ STL的查找算法

假設你有一個序列容器&#xff0c;或者有一對迭代器標識了一個區間,現在你希望在容器中查找一些信息&#xff0c;這樣的查找工作如何進行呢&#xff1f;你的選擇往往是&#xff1a; count,count_if,find,find_if,binary_search,lower_bound,upper_bound,equal_range.該如何選擇…

習題七

umask 022 &#xff0c;請描述該命令的含義創建目錄時默認的權限為&#xff1a;755 rwxr-xr-x創建文件時默認的權限為&#xff1a;644 rw-r--r--note:創建文件的默認權限是拿掉了X 所以最大為666&#xff0c;而目錄最大為777 umask NUM 就是去掉相應的權限轉載于:https://blo…

web中的cookie管理

本篇是以JSP為背景介紹&#xff0c;但是在web開發中也是相同的原理。 什么是cookie 由于http是一種無狀態的協議&#xff0c;因此服務器收到請求后&#xff0c;只會當做一次新的請求。即便你重復發送了1000次同樣的請求&#xff0c;這1000次都屬于獨立的請求。 這樣顯然效率很低…

unity怎么設置游戲頁面_杭州有沒有正規的unity游戲開發培訓機構?

現在Unity游戲開發是個火熱的行業&#xff0c;薪資待遇比較高&#xff0c;未來的發展方向和前景也比較不錯&#xff0c;很多人也都想成為專業Unity游戲開發工程師&#xff0c;學習Unity游戲開發已經成為很多追求更好就業前景的人的選擇。學習專業、系統的Unity游戲開發知識并達…

VC++ 使用attributes定義接口

1.定義預處理命令_ATL_ATTRIBUTES 2.在一個全局的Cpp文件里面配置module的attribute [module(dll, uuid "{3845951F-15B8-4286-8E7D-E9D4F5C7B6CE}", name "TestApp")]3.定義接口 [object,uuid("9F414A8A-1D5E-4aff-A60E-CFD65155ABB6"),dual,…

h3c 虛擬服務器 下一跳,H3CNE 312題和313題 直連路由靜態路由的下一跳問題

321.在MSR 路由器上看到路由表里有如下顯示&#xff1a; Destination/Mask Proto Pre Cost NextHop Interface 127.0.0.0/8 Direct 0 0 127.0.0.1 InLoop0 127.0.0.1/32 Direct 0 0 127.0.0.1 InLoop0 192.168.96.0/19 Direct 0 0 192.168.120.153 S6/0 那么關于目的地321.在MS…

C++成員變量的初始化順序問題

先來看兩道題&#xff1a; // count algorithm example #include <iostream> // std::cout #include <algorithm> // std::count #include <vector> // std::vector using namespace std; class A { public:A() { cout << "in A()&q…

Knockout.Js案例一Introduction

在這第一個教程中,您將體驗的一些基本知識構建的web UI Model-View-ViewModel使用knockout.js(MVVM)模式。案例1&#xff1a;添加:data-bind <p>First name: <strong data-bind"text:firstName">1</strong></p><p>Last name: <stro…

C#注冊表常用操作

1&#xff1a;加鍵 改值 Microsoft.Win32.RegistryKey Key Microsoft.Win32.Registry.CurrentUser.CreateSubKey( "Software\Microsoft\Internet Explorer\Main"); Key.SetValue( "Window Title" , value ); Key.Close(); …

谷歌瀏覽器外貿版_做外貿快兩個月,沒有單怎么辦?

Hello 大家好&#xff0c;我是Jack。今天給大家更新一篇在知乎看到的外貿問題&#xff1a;做外貿快兩個月&#xff0c;沒有單怎么辦?外貿這個話題在知乎算是小眾話題了&#xff0c;相比較于職場&#xff0c;英語學習&#xff0c;國際政治&#xff0c;IT等&#xff0c;這些話題…

React Native通信機制詳解

http://blog.cnbang.net/tech/2698/ React Native是facebook剛開源的框架&#xff0c;可以用javascript直接開發原生APP&#xff0c;先不說這個框架后續是否能得到大眾認可&#xff0c;單從源碼來說&#xff0c;這個框架源碼里有非常多的設計思想和實現方式值得學習&#xff0c…

C++11系列學習之四----auto

在哪些情況下要申明類型&#xff1a; 定義變量類型 函數返回值&#xff0c;函數參數 表達式返回變量類型 auto關鍵字原理 在定義變量的時候必須申明類型&#xff0c;c是強語言類型&#xff0c;在編譯階段需要知道類型&#xff0c;這樣的好處是程序效率更高&#xff0c;而…

windows 自動copy遠程服務器文件

net use h: \\123.45.67.000\T1dbbackup 123456/user:administrator ------遠程服務器IP123.45.67.000 。T1dbbackup&#xff1a;共享文件夾 。 h :映射到本機的盤符。 用戶名&#xff1a;administrator&#xff0c;密碼&#xff1a;123456copy h:\*.* f:\T1DB ------復…

eclipse 不能切換輸入法

按了AltShift鍵&#xff1f;再按一次把EN切換成CN&#xff0c;然后再CtrlShift就可以切換輸入法轉載于:https://www.cnblogs.com/jiayonghua/p/3413827.html

excel打開2個獨立窗口_謝楠稱女性獨立的不是錢是心 謝楠與吳京婚后生育2個兒子...

近日&#xff0c;在綜藝節目《幸福三重奏》 三日談妻子篇中&#xff0c;謝楠被問到如何看待獨立女性時&#xff0c;反問記者會不會問吳京同樣的問題&#xff1b;隨后回答道&#xff0c;女性獨立的不是錢&#xff0c;而是你的心&#xff1b;楠姐的回答超級霸氣了&#xff0c;你們…