交叉表,行列轉換,交叉查詢經典,分組小計合計報表,SQL,_百度文庫_第1頁
交叉表,行列轉換,交叉查詢經典,分組小計合計報表,SQL,_百度文庫_第2頁
交叉表,行列轉換,交叉查詢經典,分組小計合計報表,SQL,_百度文庫_第3頁
交叉表,行列轉換,交叉查詢經典,分組小計合計報表,SQL,_百度文庫_第4頁
交叉表,行列轉換,交叉查詢經典,分組小計合計報表,SQL,_百度文庫_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、分組小計合計報表的SQL Table1結構如下:OrgName,StaffName, PayArea,Pay要生成如下形式報表:Org1,A1,100,4Org1,A2,100,4Org1,A3,100,4Org1小計,XX,XX,XXOrg2,B1,100,4.合計, XX ,XXSQL:select OrgName DD,STAFFNAME,PayArea, Pay,OrgName as EE from Table1 as t1union select OrgName | '小計' DD,'',sum(PayArea,sum(Pay,OrgName | &#

2、39;_' EE from Table1 as t2 group by DEPT_IDunion Select '合計' as DD,'',sum(PayArea,sum(Pay,'ZZZZZZZZ' as EE from Table1 order by EE其中的OrgName|'_' 是為了取得一個比下一個不同的OraName大一些的值,以便讓小計這條數(shù)據排在適當?shù)奈恢?,如Org1小計要排在Org1和Org2之間,所以要選一個在數(shù)據庫中字符排序號小的字符,這里以"_"表示。 'ZZZZZZZ

3、Z'則是為了把合計記錄排在最后,所以要選一串在數(shù)據庫中字符排序最大的字符構成的串,這里只是用'Z'來表示。用ee 排序,但合計中 'ZZZZZZZZ' EE ,如果OrgName是漢字的話,那么排序后,合計將會變?yōu)榈谝恍械?,英文字母總是顯示在漢字前面,這樣就達不到合計顯示在最后一行的目的了,如果將合計中'ZZZZZZZZ' EE 變?yōu)?#39;做做做做做做做做' EE 這樣就能使合計排在最后一行,因為'做'字是字典中最后一個字交叉表、行列轉換和交叉查詢經典Access 靜態(tài)叉表行列轉換統(tǒng)計語句SELECT a.客戶

4、號, sum(iif(a.期初五級=1,a.期初余額,null as "期初正常",sum(iif(a.期初五級=2,a.期初余額,null as "期初關注",sum(iif(a.期初五級=3,a.期初余額,null as "期初次級",sum(iif(a.期初五級=4,a.期初余額,null as "期初可疑",sum(iif(a.期初五級=5,a.期初余額,null as "期初損失",sum(a.期初余額 as 期初總計,sum(iif(a.期未五級=1,a.期未余額,null as &

5、quot;期未正常",sum(iif(a.期未五級=2,a.期未余額,null as "期未關注",sum(iif(a.期未五級=3,a.期未余額,null as "期未次級",sum(iif(a.期未五級=4,a.期未余額,null as "期未可疑",sum(iif(a.期未五級=5,a.期未余額,null as "期未損失",sum(a.期未余額 as 期未總計,FROM work-1 as aGROUP BY a.客戶號;一、什么是交叉表“交叉表”對象是一個網格,用來根據指定的條件返回值。數(shù)據顯示

6、在壓縮行和列中。這種格式易于比較數(shù)據并辨別其趨勢。它由三個元素組成:行 列 摘要字段 “交叉表”中的行沿水平方向延伸(從一側到另一側)。在上面的示例中,“手套”(Gloves 是一行。 “交叉表”中的列沿垂直方向延伸(上下)。在上面的示例中,“美國”(USA 是一列。 匯總字段位于行和列的交叉處。每個交叉處的值代表對既滿足行條件又滿足列條件的記錄的匯總(求和、計數(shù)等)。在上面的示例中,“手套”和“美國”交叉處的值是四,這是在美國銷售的手套的數(shù)量。 “交叉表”還可以包括若干總計:每行的結尾是該行的總計。在上面的例子中,該總計代表一個產品在所有國家/地區(qū)的銷售量?!笆痔住毙薪Y尾處的值是 8,這就是

7、手套在所有國家/地區(qū)銷售的總數(shù)。 注意: 總計列可以出現(xiàn)在每一行的開頭。每列的底部是該列的總計。在上面的例子中,該總計代表所有產品在一個國家/地區(qū)的銷售量?!懊绹币涣械撞康闹凳撬?,這是所有產品(手套、腰帶和鞋子)在美國銷售的總數(shù)。 注意: 總計列可以出現(xiàn)在每一行的頂部?!翱傆嫛?Total 列(產品總計)和“總計”(Total 行(國家/地區(qū)總計)的交叉處是總計。在上面的例子中,“總計”列和“總計”行交叉處的值是 12,這是所有產品在所有國家/地區(qū)銷售的總數(shù)。 二、行列轉換和交叉查詢:1: 列轉為行:eg1:假設有張學生成績表(CJ如下name subject result張三 語文 80張

8、三 數(shù)學 90張三 物理 85李四 語文 85李四 數(shù)學 92李四 物理 82相關sql語句:Create table CJ(name char(10,subject char(10,result int;insert into CJ(name,subject,result values('張三','語文',99;insert into CJ(name,subject,result values('張三','數(shù)學',86;insert into CJ(name,subject,result values('張三',

9、'英語',75;insert into CJ(name,subject,result values('李四','語文',78;insert into CJ(name,subject,result values('李四','數(shù)學',85;insert into CJ(name,subject,result values('李四','英語',78select * from CJ想變成如下的交叉表 姓名 語文 數(shù)學 物理張三 99 90 85李四 85 92 82 我們首先來看一下如何建立

10、靜態(tài)的交叉表,也就是說列數(shù)固定的交叉表,這種情況其實只要一句簡單的Select查詢就可以搞定:select name,sum(case when a.subject='語文' then result else null end as "語文",sum(case when a.subject='數(shù)學' then result else null end as "數(shù)學",sum(case when a.subject='英語' then result else null end as "英語"

11、; from CJ a group by name;當要增加“總計”列:"合計總分"時,如下表所示:姓名 合計總分 語文 數(shù)學 物理張三 260 99 90 85李四 241 85 92 82 只需增加sum(a.result as "合計總分",sql如下:select name,sum(a.result as "合計總分",sum(case when a.subject='語文' then result else null end as "語文",sum(case when a.subject=

12、'數(shù)學' then result else null end as "數(shù)學",sum(case when a.subject='英語' then result else null end as "英語" from CJ a group by name;其中利用了CASE語句判斷,如果是相應的列,則取需要統(tǒng)計的cj數(shù)值,否則取NULL,然后再合計。其中有兩個常見問題說明一下:a、用NULL而不用0是有道理的,假如用0,雖然求和函數(shù)SUM可以取到正確的數(shù),但類似COUNT函數(shù)(取記錄個數(shù)),結果就不對了,因為Null不算一條記

13、錄,而0要算,同理空字串("")也是這樣,總之在這里應該用NULL,這樣任何函數(shù)都沒問題。b、假如在視圖的設計界面保存以上的查詢,則會報錯“沒有輸出列”,從而無法保存,其實只要在查詢前面加上一段:Create View ViewName AS .,ViewName是你準備給查詢起的名稱,.就是我們的查詢,然后運行一下,就可以生成視圖了,對于其他一些設計器不支持的語法,也可以這樣保存。以上查詢作用也很大,對于很多情況,比如產品銷售表中按照季度統(tǒng)計、按照月份統(tǒng)計等列頭內容固定的情況,這樣就行了,但往往大多數(shù)情況下列頭內容是不固定的,象City,用戶隨時可能刪除、添加一些城市,這

14、種情況就是我們所說的動態(tài)交叉表,在SQLServer中我們可以用存儲過程來解決。下面我們補充一些知識:相關子查詢相關子查詢和普通子查詢區(qū)別在于:相關子查詢引用了外部查詢的列。這種引用外部查詢的能力意味著相關子查詢不能自己獨立運行,其中對于外部查詢引用會使會使其無法正常執(zhí)行。因此相關子查詢的執(zhí)行順序如下:1.首先執(zhí)行一遍外部查詢2.對于外部查詢的每一行分別執(zhí)行一遍子查詢,而且每次執(zhí)行子查詢時候都會引用外部的當前行的值。使用子查詢的結果來確定外部查詢的結果集。舉個例子;SELECT t1.typeFROM titles t1GROUP BY t1.typeHAVING MAX(t1.advance

15、 >=ALL(SELECT 2 * AVG(t2.advanceFROM titles t2WHERE t1.type = t2.type這個結果返回最高預付款超過給定組中平均預付款兩倍的書籍類型。再舉個例子:要求返回每一個編號的最大值(列出id,name,scoreID Name(編號) Score(分數(shù))1 a 882 b 763 c 664 c 905 b 776 a 567 b 778 c 679 a 44select * from t a where score=(select Max(Score from t b where = 再給一個排位的sql語

16、句SELECT ( SELECT count(* 1 as dd FROM Test as a where a.F2 FROM Test as b order by b.F2;好了關于sql的相關子查詢先講到這里。SQLServer中局部變量賦值方法有兩種: 一種: set 變量名 = 值 二種: select 變量名 = 值 第二種可以從某個表中得到數(shù)據再賦值給變量 例: 從用戶信息表中查詢中cid為 20 的用戶姓名將他賦值給變量 name declare name varchar(10 -用戶名 select name=userName from userInfo where cid =

17、 20 print 'cid為20的用戶姓名:' + name 遞歸的select變量遞歸的select變量是指使用select語句和子查詢將一個變量與其自身拼接起來。語法形式如下:select variable = variable + table.column from table-見sql server2000寶典:P354,這是一種很優(yōu)美的查詢方法.從而將基礎表中垂直的列數(shù)據改為水平方向的數(shù)據。這樣就可以替代游標。動態(tài)的交叉表這樣就代替了傳統(tǒng)的游標。SQL語句解決方法:寫法一:declare sql varchar(4000set sql = 'select n

18、ame'select sql = sql + ',sum(case subject when '''+subject+''' then result end as '+subjectfrom (select distinct subject from CJ as aselect sql = sql+' from CJ group by name'exec(sql寫法二:declare sql varchar(4000set sql = 'select name'select sql = sq

19、l + ',sum(case subject when '''+subject+''' then result end as '+subject+' from CJ group by subjectselect sql = sql+' from CJ group by name'exec(sql具體不同的多種寫法參見本文相關鏈接文章中的其他例子在Access中還提供了TransForm來實現(xiàn)行列轉換TRANSFORM count(Result AS number SELECT 姓名 FROM 學生成績表 G

20、ROUP BY 姓名 PIVOT Subject;TransForm 用法如下:=TRANSFORM aggfunction selectstatement PIVOT pivotfield IN (value1, value2, . TRANSFORM 語句可分為以下幾個部分: 部分 描述 aggfunction 在選定數(shù)據上運作的 SQL 合計函數(shù)。 selectstatement SELECT 語句。 pivotfield 在查詢的結果集中創(chuàng)建列標題時用的字段或表達式。 value1, value2 用來創(chuàng)建列標題的固定值。 說明 使用交叉表查詢來摘要數(shù)據時,從指定的字段或表達式中選定值

21、作為列標題, 這樣,可以用比選定查詢更緊湊的格式來觀察數(shù)據。 TRANSFORM 是可選的,但在使用它時,要作為 SQL 字符串中的第一個語句。 它出現(xiàn)在 SELECT 語句(指定作為行標題的字段的)之前,還出現(xiàn)在 GROUP BY 子句 (指定行分組的)之前??梢杂羞x擇地包含其它子句,例如 WHERE 子句,它指定附 加的選擇或排序條件。也可以將子查詢當作謂詞,特別是在叉表查詢的 WHERE 子句中。 pivotfield 返回的值被用作查詢結果集中的列標題。 例如,在交叉表查詢中,將根據銷售圖表按銷售月份創(chuàng)建 12 個列。 可以限制 pivotfield 用列在可選的 IN 子句中的固定值

22、(value1, value2)來創(chuàng)建標題。 也可以用沒有數(shù)據存在的固定值來創(chuàng)建附加的列。 2. 列行轉換暫時保留3. 行列轉換-加合并有表A,id pid1 11 21 32 12 23 1如何化成表B:id pid1 1,2,32 1,23 1創(chuàng)建一個合并的函數(shù)create function fmerg(id intreturns varchar(8000asbegindeclare str varchar(8000set str=''select str=str+','+cast(pid as varchar from 表A where id=idset

23、str=right(str,len(str-1return(strEndgo-調用自定義函數(shù)得到結果select distinct id,dbo.fmerg(id from 表A相關鏈接:把列變成行的sql語句: 應用SQL交叉表實現(xiàn)行列轉換: oracle 行列轉換: 行列轉換例子: 動態(tài)SQL的使用例子, 行列轉換: SqlServer如何生成動態(tài)交叉表查詢: SQL語句精典收藏SqlServer生成交叉表大全 分類: SqlServer 2007-12-05 16:39 601人閱讀 評論(0 收藏 舉報  SqlServer如何生成動態(tài)交叉表查詢VB+MS SqlServer

24、,是我們目前開發(fā)數(shù)據庫應用系統(tǒng)最常用的模式,翻翻以前的老帖子,有一些SqlServer的問題經常被提出來,但正確解答甚少,現(xiàn)把我對這些問題的見解貼出來,這次先講講動態(tài)交叉表的問題為了說明問題,我們用SqlServer自帶的事例數(shù)據庫(Northwind來進行驗證,所有的例子請放到Northwind中運行,我可能會省略Use語句,所引用的表,都是Northwind中的,下面我就不再說明了我這里指的交叉表,就是象Access的交叉表查詢一樣的效果,比如Employees表中City字段代表了城市的名稱,TitleOfCourtesy代表稱呼,我們希望按照City和TitleOfCourtesy的情

25、況來統(tǒng)計ReportsTo字段的合計數(shù)(本統(tǒng)計沒有任何實際意義,只是挑選一些記錄包含重復內容的字段來說明情況),并顯示成以下格式:(TitleOfCourtesy作為行,City作為列)TitleOfCourtesyLondonCityRedmondCitySeattleCityDr.   Mr.12  Mrs. 2 Ms.5 4探討這個問題之前,我們首先來看一下如何建立靜態(tài)的交叉表,也就是說列數(shù)固定的交叉表,這種情況其實只要一句簡單的Select查詢就可以搞定:SELECT TitleOfCourtesy, &#

26、160; SUM(CASE City WHEN 'London' THEN ReportsTo ELSE NULL END AS London City,  SUM(CASE City WHEN 'Redmond' THEN ReportsTo ELSE NULL END AS Redmond City,  SUM(CASE City WHEN 'Seattle' THEN ReportsTo ELSE NULL END AS Seattle CityFROM Employees GROUP BY TitleOfCourtes

27、y其中利用了CASE語句判斷,如果是相應的列,則取需要統(tǒng)計的ReportsTo數(shù)值,否則取NULL,然后再合計其中有兩個常見問題說明一下:a、用NULL而不用0是有道理的,假如用0,雖然求和函數(shù)SUM可以取到正確的數(shù),但類似COUNT函數(shù)(取記錄個數(shù)),結果就不對了,因為Null不算一條記錄,而0要算,同理空字串("")也是這樣,總之在這里應該用NULL,這樣任何函數(shù)都沒問題。b、假如在視圖的設計界面保存以上的查詢,則會報錯“沒有輸出列”,從而無法保存,其實只要在查詢前面加上一段:Create View ViewName AS .,ViewName是你準備給查詢起的名稱,.

28、就是我們的查詢,然后運行一下,就可以生成視圖了,對于其他一些設計器不支持的語法,也可以這樣保存。以上查詢作用也很大,對于很多情況,比如按照季度統(tǒng)計、按照月份統(tǒng)計等列頭內容固定的情況,這樣就行了,但往往大多數(shù)情況下列頭內容是不固定的,象City,用戶隨時可能刪除、添加一些城市,這種情況,我們就需要用存儲過程來解決:總體思路其實很簡單,首先檢索列頭信息,形成一個游標,然后遍歷游標,將上面查詢語句里Case判斷的內容用游標里的值替代,形成一條新的Sql查詢,然后執(zhí)行,返回結果,就可以了,以下是我寫的一個存儲過程,供大家參考:CREATE procedure CorssTab strTabName a

29、s varchar(50 = 'Employees', -此處放表名strCol as varchar(50 = 'City',                       -表頭分組依據字段strGroup as varchar(50 = 'TitleOfCourtesy',-分組字段strNumber as varchar(5

30、0 = 'ReportsTo',    -被統(tǒng)計的字段strSum as varchar(10 = 'Sum'                     -運算方式ASDECLARE strSql as varchar(1000, strTmpCol as varchar(100EXECUTE ('DECLARE corss_cu

31、rsor CURSOR FOR SELECT DISTINCT ' + strCol + ' from ' + strTabName + ' for read only ' -生成游標begin  SET nocount ON   SET strsql ='select ' + strGroup + ', ' + strSum + '(' + strNumber + ' AS ' + strSum + ' of ' + strNumber + '&

32、#39; -查詢的前半段  OPEN corss_cursor  while (0=0  BEGIN    FETCH NEXT FROM corss_cursor -遍歷游標,將列頭信息放入變量strTmpCol    INTO strTmpCol    if (fetch_status<>0 break          SET strsql = strsql + 

33、9;, ' + strSum + '(CASE ' + strCol + ' WHEN ''' + strTmpCol + ''' THEN ' + strNumber + ' ELSE Null END AS ' + strTmpCol + ' ' + strCol + '' -構造查詢  END        SET strsql = strsql + ' from &

34、#39; + strTabname + ' group by ' + strGroup -查詢結尾  EXECUTE(strsql -執(zhí)行  IF error <>0 RETURN error -如果出錯,返回錯誤代碼  CLOSE corss_cursor   DEALLOCATE corss_cursor RETURN 0 -釋放游標,返回0表示成功endGO幾點說明:a、這是一個通用存儲過程,使用時strTabName、strCol、strGroup、strNumber、strSum幾個變量設置一下就可以用到其他表上,其

35、中結果集的第二列我加了個合計列b、為了測試方便,我在存儲過程中設置了默認值,就是前面提到的Employees表,這樣直接運行時就可以出來我上面提到的結果。c、使用時,可以把上面的代碼復制到企業(yè)管理器的查詢設計界面Sql窗格,或者查詢分析器里運行一下(注意正確選擇NorthWind數(shù)據庫),就可以生成一個存儲過程:CorssTab,然后直接運行CorssTab,如果出現(xiàn)本文前面類似的窗格,就表示運行成功了。d、假如用于其它表,首先需要在你的用戶數(shù)據庫里生成此存儲過程(當然也可以放到Master里,然后再加個變量:DataBase,賦值為數(shù)據庫名稱,然后在上面代碼打開指定數(shù)據庫,這樣所有的數(shù)據庫都

36、可以調用它),當你調用時,采取以下格式:CorssTab strTabName = 'Orders', strCol = 'DATEPART(yy, OrderDate',strGroup = 'CustomerID', strNumber = 'OrderID', strSum = 'Count'上面這條語句統(tǒng)計了NorthWind中Orders表里每個客戶年度訂單數(shù)量,大家可以運行試一下效果,雖然列頭顯示的名稱不恰當,但基本效果出來了,相信大家通過對我的代碼再作簡單修改,可以達到滿意的交叉表效果。下次我再講講,

37、如何給查詢的記錄集自動加行號  動態(tài)SQL的使用例子, 行列轉換drop table #testcreate table #test(name  nvarchar(20,type  nvarchar(20,category  nvarchar(20select * from #testinsert into #test(name,type,category values ('n1','t1&#

38、39;,'c1'insert into #test(name,type,category values ('n2','t1','c2'insert into #test(name,type,category values ('n3','t2','c1'insert into #test(name,type,category values ('n4',

39、't3','c3'insert into #test(name,type,category values ('n5','t2','c4'insert into #test(name,type,category values ('n6','t3','c5'insert into #test(name,type,category values ('

40、;n1','t1','c1'-select category,name,sum(case when type='t1' then 1 else 0 end,sum(case when type='t2' then 1 else 0 end,sum(case when type='t3' then 1 else&

41、#160;0 end from #test group by name,category-如果type不固定-使用動態(tài)SQL語句 Declare S Varchar(8000Select S = 'Select     category, name'Select S = S + ', SUM(Case type W

42、hen ''' + type + ''' Then 1 Else 0 End As ' + typeFrom #TEST Group By typeSelect S = S + ' From #TEST Group By category, na

43、me Order By category, name'print SEXEC(SGO  -測試數(shù)據   行轉列  Create   table   test   (name   char(10,km   char(10,cj   int    

44、0;insert   test   values('張三','語文',80     insert   test   values('張三','數(shù)學',86     insert   test   values('張三','英語

45、9;,75     insert   test   values('李四','語文',78     insert   test   values('李四','數(shù)學',85     insert   test  

46、60;values('李四','英語',77         -查詢     declare   sql   varchar(8000,s1   varchar(8000     select   sql   = &#

47、160; '',s1=''         select   sql   =   sql+   ','+km+'=sum(case   km   when   '''+km+'''

48、60;  then   cj   else   0   end'     ,s1=s1+',sum(case   km   when   '''+km+'''   then   cj &

49、#160; else   0   end/sum(case   km   when   '''+km+'''   then   1   else   0   end'     from

50、   test       group   by   km     exec('select   name=case   grouping(name   when   1   then   '&

51、#39;全班總分''   else   name   end'+sql+',小計=sum(cj     from   test     group   by   name   with   rollup  &

52、#160;  union   all     select   ''全班平均分'''+s1+',sum(cj/count(distinct   name     from   test'     go    

53、60;    -刪除測試     drop   table   test    -MS SQL2000下月份不固定的動態(tài)寫法Create Table TEST(class    Nvarchar(10, name    Nvarchar(10, 年份  

54、60; Int, 1月        Varchar(10, 2月        Varchar(10, 3月        Varchar(10Insert TEST Select N'一班',N'張三',2007,'5元','2元

55、','5元'Union All Select N'一班',N'李四',2006,'3元','0元','1元'Union All Select N'二班',N'王五',2007,'0元','0元','1元'GODeclare S Nvarchar(4000Select S = ''Selec

56、t S = S + ' Union Select class, name, 年份, ''' + Name + ''' As 月份, ' + Name + ' As 元  From TEST ' From SysColum

57、ns Where ID = OBJECT_ID('TEST' And Name Like '%月' Order By NameSelect S = Stuff(S, 1, 7, ''Print SEXEC(SGODrop Table TEST -動態(tài)月份2005 處理如下:-測試環(huán)境create table t

58、b_tb(class varchar(10,name varchar(10,年份 varchar(10,1月 varchar(10,2月 varchar(10,3月 varchar(10insert into tb_tb select '一班','張三','2007','5元','2元','5元'union all select '一班','李四&

59、#39;,'2006','3元','0元','1元'union all select '二班','王五','2007','0元','0元','1元'-計算月份:declare 月份 varchar(100set 月份=''select 月份=月份+','+name+'' from sys.column

60、s where object_id=object_id('tb_tb'and name like '%月'set  月份=stuff(月份,1,1,''-交叉表處理exec('select * from tb_tbunpivot    ( 金額 for 月份 in ('+月份+' unptwhere 金額<&g

61、t;''0元'''-刪除測試環(huán)境drop table tb_tb  -建立測試環(huán)境Create Table 表1(id    Int, 名稱    Nvarchar(20Insert 表1 Select 1,       N'名稱1'Union All Select

62、0;2,       N'名稱2'Union All Select 3,       N'名稱3'Create Table 表2(id        Int, 時間    Nvarchar(10, 地點   

63、 Nvarchar(10Insert 表2 Select 1,          N'5日',        N'上海'Union All Select 1,          N'9日', 

64、       N'北京'Union All Select 1,          N'20日',      N'天津'Union All Select 2,         

65、; N'8日',        N'杭州'Union All Select 2,          N'19日',       N'廣州'Union All Select 3,   &#

66、160;      N'8日',        N'深圳'GO-創(chuàng)建函數(shù)Create Function F_TEST(id IntReturnS Nvarchar(4000AsBegin    Declare S Nvarchar(4000    Select S =

67、 ''    Select S = S + '' + 時間 + '-' + 地點 From 表2 Where id = id    Select S = Stuff(S, 1, 1, ''  &#

68、160; Return SEndGO-測試Select    id,    dbo.F_TEST(id As 時間、地點From    表1GO-刪除測試環(huán)境Drop Table 表1, 表2Drop Function F_TEST 把列變成行的sql語句線有如下表:  科目   分數(shù)    姓名  語文&#

69、160;    88      董兆  數(shù)學    95       董兆  英語     89      董兆  語文     69      嬋娟  數(shù)學    95 

70、;      嬋娟  英語     89      嬋娟  語文     69      李慧  數(shù)學    95       李慧  英語     89    

71、;  李慧一條sql語句,查詢結果是         李慧 嬋娟 董兆  語文   69    69   88  數(shù)學   95     95  95  英語   89    89   89sql語句如下:create table k(科目 varchar(50,分數(shù)

72、int,姓名 varchar(50insert k select '語文',88,'董兆'union all select '數(shù)學',95,'董兆'union all select '英語',89,'董兆'union all select '語文',69,'嬋娟'union all select '數(shù)學',95,'嬋娟'union all select '英語',89,'嬋娟'union all sele

73、ct '語文',69,'李慧'union all select '數(shù)學',95,'李慧'union all select '英語',89,'李慧'declare s varchar(8000set s='select 科目'select s=s+','+姓名+'=sum(case 姓名 when '''+姓名+''' then 分數(shù) else 0 end'from k group by 姓名exec(s+

74、'from k group by 科目' 應用SQL交叉表實現(xiàn)行列轉換-數(shù)據結構 IDint40Gradevarchar501ExamYearvarchar501Namevarchar501Subjectvarchar501Scoreint41-數(shù)據體 IDGradeExamYearNameSubjectScore1.          2004級2班2004李明數(shù)學1002.       

75、   2004級2班2004王強數(shù)學903.          2004級2班2004付超數(shù)學854.          2004級2班2004李明語文755.          2004級2班2004王強語文896.       

76、0;  2004級2班2004付超化學897.          2004級2班2004李明化學458.          2004級2班2004王強化學789.          2004級2班2005李明數(shù)學8910.      2004級2班2005王強數(shù)學881

77、1.      2004級2班2005付超數(shù)學8612.      2004級2班2005李明語文7813.      2004級2班2005王強語文9214.      2004級2班2005付超化學9415.      2004級2班2005付超語文5916.      2004級2班2005李

78、明化學5417.      2004級2班2005王強化學80 -SQL語句DeclareSqlStrnvarchar(2000 -構建Sql語句,生成2004級2班 2004年的考慮成績表SelectSqlStr='selectGrade,ExamYear,Name,' -生成條件選擇語句,使用Distinct把所有科目全部列出,當然,可以加上條件,如:僅某一年度的考試科目SelectSqlStr=SqlStr+'SUM(CASESubjectWHEN'''+Sub

79、ject+'''THENScoreELSE0ENDAS'''+Subject+''','from(SelectDistinctSubjectfromExamResultwhereExamYear=2004AsTemTable -補全Sql語句,并使用GroupBy對重復的記錄進行匯總SelectSqlStr=left(SqlStr,Len(SqlStr-1+'fromExamResultwhereExamYear=2004GroupByName,Grade,ExamYear' -執(zhí)行SqlExec(SqlStrGo -執(zhí)行結果    Grade ExamYear Name 化學 數(shù)學 語文

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論