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交叉表On條件是否可以用like連接
select
a.ID,a.DEP,
sum(casewhenb.WENJIAN_LEIXING='文件'then1else0end)文件,
sum(casewhenb.WENJIAN_LEIXING='通知'then1else0end)通知
fromDEPaleftjoinWENJIANbona.id=b.DEP_ID
groupbya.ID,a.DEP
;
❸ sql交叉表寫法,出考勤報表
--我寫下我的思路吧--
--先取工號姓名,如果考勤表.EMPLOYEEID=員工表.employeeID,則--
selectb.employeeno工號,b.name姓名fromattena,employeeb
wherea.employeeid=b.employeeID--假設考勤表是atten--
--------------------------------------
--行轉列,將1號到30號,從IN_TEIM、OUT_TIME中獲取
select
if(IN_TIMElike'01.11%',RIGHT(IN_TIME,5),null)as'1號上班'
if(OUT_TIMElike'01.11%',RIGHT(OUT_TIME,5),null)as'1號下班'
fromATTENgroupbyIN_TIME,OUT_TIME
--如何實現將多個數值寫到一個欄位中,還需要再研究下。大體思路就這這樣。--
❹ 關於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 交叉表是個什麼概念
就是笛卡爾積啊!R表x行n列,S表y行m列,得到的交叉表是x*y行,(m+n)列
❻ 兩表關聯的分組的交叉表,如何使用sql語句完成。目標如下圖
SELECT
*
FROM
(
SELECT
t1.km, t1.[year], t2.[user], t2.[money]
FROM
#t1 t1 JOIN #t2 t2
ON (t1.id = t2.fid)
) subQuery
PIVOT(
SUM(subQuery.[money])
FOR subQuery.[year] IN ([2008], [2009], [2010] )
) tmp
order by
1
❼ 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)
❽ SQL用交叉報表時報錯:在將 varchar 值 'then result else 0 end)' 轉換成數據類型 int 時失敗。
我暈....這代碼好亂
你定義的@sql在賦值的時候, 沒有對單引號進行轉義, 所以整個字元串是斷開的
把SQL語句中要用到的單引號, 使用兩個連續的單引號進行轉義