沒有直接的轉換方法,建議這樣:

目前成都創(chuàng)新互聯(lián)公司已為超過千家的企業(yè)提供了網站建設、域名、網站空間、網站托管運營、企業(yè)網站設計、鲅魚圈網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
select?貨號,品名=dbo.shfcoltostr(貨號)?from?TABLENAME
輸出結果
貨號????品名
1????????A?,???????????AB,?????????ABB????
2????????B?,???????????BC
前題條件:在查詢分析器中執(zhí)行建立以下自定義函數(shù)
CREATE?function?shfColToStr
(@HH?varchar(18))
returns?varchar(5000)
begin
declare?@result?varchar(5000)
select?@result=isnull(@result+',','')+品名?from?TABLENAME?where?貨號=@HH?
return?@result
end
go
OK 了沒有啊?
好吧,再給你一個方法,與你的要求分毫不差:
需要先根據品名或品名ID生成一個按貨號分組的序號,存到臨時表,以最多10個品名為例:
臨時表生成:
SELECT?*,SN=(SELECT?COUNT(1)?FROM?TABLENAME?A?WHERE?A.品名=tablename.品名?and?a.貨號=tablename.貨號)?into?#tablename?FROM?TABLENAME
看看這個臨時表,多出了一個SN(序號),然后用下面的語句查詢:
select?DISTINCT?t.貨號,
品名1=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=1),''),
品名2=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=2),''),
品名3=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=3),''),
品名4=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=4),''),
品名5=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=5),''),
品名6=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=6),''),
品名7=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=7),''),
品名8=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=8),''),
品名9=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=9),''),
品名10=isnull((select?top?1?a.品名?from?#tablename?a?where?a.貨號=t.貨號?and?a.sn=10),'')
from?#tablename?t
看上去復雜,寫起來容易,只需復制 ?復制 品名n=....sn=n10次,然后改品名后綴和SN值即可。
結果:
貨號?品名1?品名2?品名3?品名4?品名5?品名6?品名7?品名8?品名9?品名10?
1????A?????AB????ABB????
2????B?????BC
這里指的交叉表,就是象Access的交叉表查詢一樣的效果,比如Employees表中City字段代表了城市的名稱,TitleOfCourtesy代表稱呼,我們希望按照City和TitleOfCourtesy的情況來統(tǒng)計ReportsTo字段的合計數(shù)(本統(tǒng)計沒有任何實際意義,只是挑選一些記錄包含重復內容的字段來說明情況),并顯示成以下格式:(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語句判斷,如果是相應的列,則取需要統(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是你準備給查詢起的名稱,...就是我們的查詢,然后運行一下,就可以生成視圖了,對于其他一些設計器不支持的語法,也可以這樣保存。 總體思路其實很簡單,首先檢索列頭信息,形成一個游標,然后遍歷游標,將上面查詢語句里Case判斷的內容用游標里的值替代,形成一條新的Sql查詢,然后執(zhí)行,返回結果,就可以了,以下是我寫的一個存儲過程,供大家參考:CREATE?0?2procedure?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--被統(tǒng)計的字段@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_status0)?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--執(zhí)行?0?2?0?2IF?0?2@@error?0?20?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、使用時,可以把上面的代碼復制到企業(yè)管理器的查詢設計界面Sql窗格,或者查詢分析器里運行一下(注意正確選擇NorthWind數(shù)據庫),就可以生成一個存儲過程:CorssTab,然后直接運行CorssTab,如果出現(xiàn)本文前面類似的窗格,就表示運行成功了。 d、假如用于其它表,首先需要在你的用戶數(shù)據庫里生成此存儲過程(當然也可以放到Master里,然后再加個變量:@DataBase,賦值為數(shù)據庫名稱,然后在上面代碼打開指定數(shù)據庫,這樣所有的數(shù)據庫都可以調用它),當你調用時,采取以下格式:
sql = select 節(jié)次,sum(case subject when '星期一 ' then source else 0 end) as '星期一 ' , sum(case subject when '星期二' then source else 0 end) as 星期二', sum(case subject when '星期三' then source else 0 end) as '星期三' from 課程 group by 節(jié)次;
當然也可以用存儲過程來實現(xiàn)
你說的對,少一種情況(ab在起至時間之間的)。
where (起始時間 between a and b) or (截止時間 between a and b) or (a between 起始時間 and截止時間)
假設有兩張表,A表和B表,A表有m條記錄,x個屬性;B表有n條記錄,y個屬性
交叉連接(cross join):A表和B表交叉連接就是,A表中的每條記錄都和B表的的記錄進行連接。A表和B表交叉最后會得到一個表會有m×n條記錄,屬性會有x+y個。而且這種連接比較消耗資源。
內部連接: 它是交叉連接的一個變形,內部連接一般都會有一個連接條件,只有滿足條件的連接才會被選中。如果內部連接沒有設置合理的條件,那它和交叉連接是等價的。一般得到的表會是=m×n條記錄,=x+y個屬性。
--靜態(tài)SQL
select [商品款號],[品名],[采購價],[零售單價],[顏色],[碼系],
case [序號] when 0 then [數(shù)量] else null end "0",
case [序號] when 1 then [數(shù)量] else null end "1",
case [序號] when 2 then [數(shù)量] else null end "2",
case [序號] when 3 then [數(shù)量] else null end "3",
case [序號] when 4 then [數(shù)量] else null end "4"
from [出入庫明細]
--動態(tài)SQL
declare @sql varchar(8000)
set @sql = 'select [商品款號],[品名],[采購價],[零售單價],[顏色],[碼系]'
select @sql = @sql + ' , case [序號] when ' + seq + ' then [數(shù)量] else 0 end "' + seq + '"'
from (select distinct cast([序號] as varchar) seq from [出入庫明細]) as a
set @sql = @sql + ' from [出入庫明細]'
print @sql
exec(@sql)
當前題目:sqlserver交叉,sqlserver交叉表
網站鏈接:http://chinadenli.net/article45/dsgejei.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站設計公司、外貿網站建設、網站設計、網站建設、搜索引擎優(yōu)化、網頁設計公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)