sql交叉表查詢
㈠ sql 交叉表是個什麼概念
就是笛卡爾積啊!R表x行n列,S表y行m列,得到的交叉表是x*y行,(m+n)列
㈡ 計算機二級題:交叉表查詢能否通過SQL查詢創建
在SQL 中所謂的交叉表,通俗點說,就是我們所說的行轉列,都是這么理解的。 交叉表又分為,動態交叉表,靜態交叉表,反轉交叉表, 靜態交叉表,一般用CASE實現 反轉交叉表,一般用PIVOT實現 動態交叉表,好像只能用存儲。
㈢ SQL 交叉表查詢問題
典型的豎表轉橫表。你去網上搜一下,很多這樣的代碼。
這個我之前有遇到過。想寫一個sql直接實現,發現寫起來比較麻煩。最後,我直接用程序來實現。
先查詢出所有人名和科目,這里可以用distinct。
接著建立一張二維表,列索引為人名,橫索引為學科,假設表名是dataTable,則dataTable[name][subject] 存儲的該科成績。
這么做不會太難,時間復雜度是O(N),N為記錄的條數。不過如果數據多,空間上開銷肯定不行的。
而對於稀疏的表,這方法很不好。
不過因為我做的系統當時人數不到500,科目也不到20,就是可以承受的。
大數據的我也不知道怎麼做。
㈣ sql語句中交叉報表的使用
DECLARE@sNVARCHAR(4000)
SELECT@s=ISNULL(@s+',','')+QUOTENAME(標志)
FROM表
---行列轉換
DECLARE@SQLNVARCHAR(4000)
SELECT@SQL='
SELECT*
FROM表(帶有轉換標志)PIVOT(SUM(實際需要欄位)
for[標志]in('+@s+')
)A'
EXEC(@SQL)
㈤ SqlServer如何生成動態交叉表查詢
這里指的交叉表,就是象Access的交叉表查詢一樣的效果,比如Employees表中City欄位代表了城市的名稱,TitleOfCourtesy代表稱呼,我們希望按照City和TitleOfCourtesy的情況來統計ReportsTo欄位的合計數(本統計沒有任何實際意義,只是挑選一些記錄包含重復內容的欄位來說明情況),並顯示成以下格式:(TitleOfCourtesy作為行,City作為列) ,�0�2�0�2SUM(CASE�0�2City�0�2WHEN�0�2'Redmond'�0�2THEN�0�2ReportsTo�0�2ELSE�0�2NULL�0�2END)�0�2AS�0�2[Redmond�0�2City] ,�0�2�0�2SUM(CASE�0�2City�0�2WHEN�0�2'Seattle'�0�2THEN�0�2ReportsTo�0�2ELSE�0�2NULL�0�2END)�0�2AS�0�2[Seattle�0�2City]FROM�0�2Employees�0�2GROUP�0�2BY�0�2TitleOfCourtesy 其中利用了CASE語句判斷,如果是相應的列,則取需要統計的ReportsTo數值,否則取NULL,然後再合計 其中有兩個常見問題說明一下: a、用NULL而不用0是有道理的,假如用0,雖然求和函數SUM可以取到正確的數,但類似COUNT函數(取記錄個數),結果就不對了,因為Null不算一條記錄,而0要算,同理空字串("")也是這樣,總之在這里應該用NULL,這樣任何函數都沒問題。 b、假如在視圖的設計界面保存以上的查詢,則會報錯「沒有輸出列」,從而無法保存,其實只要在查詢前面加上一段:Create View ViewName AS ...,ViewName是你准備給查詢起的名稱,...就是我們的查詢,然後運行一下,就可以生成視圖了,對於其他一些設計器不支持的語法,也可以這樣保存。 總體思路其實很簡單,首先檢索列頭信息,形成一個游標,然後遍歷游標,將上面查詢語句里Case判斷的內容用游標里的值替代,形成一條新的Sql查詢,然後執行,返回結果,就可以了,以下是我寫的一個存儲過程,供大家參考:CREATE�0�2procere�0�2CorssTab�0�2 @strTabName�0�2as�0�2varchar(50)�0�2=�0�2'Employees' ,�0�2--此處放表名@strCol�0�2as�0�2varchar(50)�0�2=�0�2'City' ,�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2--表頭分組依據欄位@strGroup�0�2as�0�2varchar(50)�0�2=�0�2'TitleOfCourtesy',--分組欄位@strNumber�0�2as�0�2varchar(50)�0�2=�0�2'ReportsTo' ,�0�2�0�2�0�2�0�2--被統計的欄位@strSum�0�2as�0�2varchar(10)�0�2=�0�2'Sum'�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2--運算方式ASDECLARE�0�2@strSql�0�2as�0�2varchar(1000 ),�0�2@strTmpCol�0�2as�0�2varchar(100)EXECUTE�0�2('DECLARE�0�2corss_cursor�0�2CURSOR�0�2FOR�0�2SELECT�0�2DISTINCT�0�2'�0�2+�0�2@strCol�0�2+�0�2'�0�2from�0�2'�0�2+�0�2@strTabName�0�2+�0�2'�0�2for�0�2read�0�2only�0�2')�0�2--生成游標begin�0�2�0�2SET�0�2nocount�0�2ON�0�2�0�2�0�2SET�0�2@strsql�0�2='select�0�2'�0�2+�0�2@strGroup�0�2+�0�2' ,�0�2'�0�2+�0�2@strSum�0�2+�0�2'('�0�2+�0�2@strNumber�0�2+�0�2')�0�2AS�0�2['�0�2+�0�2@strSum�0�2+�0�2'�0�2of�0�2'�0�2+�0�2@strNumber�0�2+�0�2']'�0�2--查詢的前半段�0�2�0�2OPEN�0�2corss_cursor�0�2�0�2while�0�2(0=0)�0�2�0�2BEGIN�0�2�0�2�0�2�0�2FETCH�0�2NEXT�0�2FROM�0�2corss_cursor�0�2--遍歷游標,將列頭信息放入變數@strTmpCol �0�2�0�2�0�2�0�2INTO�0�2@strTmpCol�0�2�0�2�0�2�0�2if�0�2(@@fetch_status<0)�0�2break�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2SET�0�2@strsql�0�2=�0�2@strsql�0�2+�0�2' ,�0�2'�0�2+�0�2@strSum�0�2+�0�2'(CASE�0�2'�0�2+�0�2@strCol�0�2+�0�2'�0�2WHEN�0�2'''�0�2+�0�2@strTmpCol�0�2+�0�2'''�0�2THEN�0�2'�0�2+�0�2@strNumber�0�2+�0�2'�0�2ELSE�0�2Null�0�2END)�0�2AS�0�2['�0�2+�0�2@strTmpCol�0�2+�0�2'�0�2'�0�2+�0�2@strCol�0�2+�0�2']'�0�2--構造查詢�0�2�0�2END�0�2�0�2�0�2�0�2�0�2�0�2�0�2�0�2SET�0�2@strsql�0�2=�0�2@strsql�0�2+�0�2'�0�2from�0�2'�0�2+�0�2@strTabname�0�2+�0�2'�0�2group�0�2by�0�2'�0�2+�0�2@strGroup�0�2--查詢結尾�0�2�0�2EXECUTE(@strsql)�0�2--執行�0�2�0�2IF�0�2@@error�0�2<0�0�2RETURN�0�2@@error�0�2--如果出錯,返回錯誤代碼�0�2�0�2CLOSE�0�2corss_cursor�0�2�0�2�0�2DEALLOCATE�0�2corss_cursor�0�2RETURN�0�20�0�2--釋放游標,返回0表示成功endGO幾點說明:a、這是一個通用存儲過程,使用時@strTabName、@strCol、@strGroup、@strNumber、@strSum幾個變數設置一下就可以用到其他表上,其中結果集的第二列我加了個合計列 b、為了測試方便,我在存儲過程中設置了默認值,就是前面提到的Employees表,這樣直接運行時就可以出來我上面提到的結果。 c、使用時,可以把上面的代碼復制到企業管理器的查詢設計界面Sql窗格,或者查詢分析器里運行一下(注意正確選擇NorthWind資料庫),就可以生成一個存儲過程:CorssTab,然後直接運行CorssTab,如果出現本文前面類似的窗格,就表示運行成功了。 d、假如用於其它表,首先需要在你的用戶資料庫里生成此存儲過程(當然也可以放到Master里,然後再加個變數:@DataBase,賦值為資料庫名稱,然後在上面代碼打開指定資料庫,這樣所有的資料庫都可以調用它),當你調用時,採取以下格式:
㈥ 如何用SQL語句實現交叉表查詢
一種是在Where條件中少寫條件
mysql有一個cross join
㈦ 怎麼使用SQL創建名為學生成績表_交叉表的查詢要用的欄位有學號,姓名,課程名稱,成績
create table 學生成績表 as select 學號,姓名,課程名稱,成績 from table1,table2
select後欄位前加表別名
㈧ 關於SQL Server交叉表的查詢問題
select identity(int,1,1) as id,,* from (
select name,N'數學' as subject,數學 as Source from a
union
select name,N'英語' as subject,英語 as Source from a
union
select name,N'語文' as subject,語文 as Source from a )c
order by c.source
㈨ SQL中的交叉表查詢,來個稍微復雜點的例子吧
select d.name as clientname,c.prono,sum(a.ck_kg) as ck_kg,sum(a.ck_pcs) as ck_pcs,0 as fd_kg,0 as fd_pcs,trunc(b.docdate) as docdate from pl_cpch_line a
join pl_cpch b on A.CPCH_ID=b.cpch_id
join v_pl_scrk_line c on a.scrk_line_id=c.scrk_line_id
join bd_client d on b.client_id=d.client_id
group by d.name,c.prono,b.docdate
夠復雜了吧
㈩ 怎麼用SQL語句寫交叉表啊
select a.學號,a.姓名,a.成績 flash成績,b.成績 dw成績,c.成績 asp成績
from 表 a left join 表 b on a.學號=b.學號 and a.課程名>b.課程名
left join 表 c on a.學號=c.學號 and a.課程名>c.課程名
and b.課程名>c.課程名
where c.成績 is not null