① asp + sqlserver 交叉表問題
select
學號,
姓名,
flash成績=(select 成績 from cj b where b.課程名='flash' and b.學號=a.學號),
dw成績=(select 成績 from cj b where b.課程名='dw' and b.學號=a.學號),
asp成績=(select 成績 from cj b where b.課程名='asp' and b.學號=a.學號)
from cj a
group by 學號,姓名
② SQLSERVER的多表查詢問題
屬於多表鏈接
在兩個表之間使用【,】進行的鏈接,默認是交叉鏈接,也就是會生笛卡爾積
③ SqlServer2005交叉表查詢問題
DECLARE @str as nVARCHAR(max)
set @str='yyq,'
select @str=@str+''''+fkmc+''''+'=sum(case fkmc when
'+''''+fkmc+''''+' then fk else null end),'
from hb group by fkmc
set @str='select '+substring(@str,1,len(@str)-1)+',sum(fk) as 合計 from hb group by yyq'
print @str
exec(@str)
你這樣寫,我執行了一下是可以的,除了數據為空時,其他都可以的
④ SQLServer中的交叉查詢
沒有直接的轉換方法,建議這樣:
select貨號,品名=dbo.shfcoltostr(貨號)fromTABLENAME
輸出結果
貨號品名
1A,AB,ABB
2B,BC
前題條件:在查詢分析器中執行建立以下自定義函數
CREATEfunctionshfColToStr
(@HHvarchar(18))
returnsvarchar(5000)
begin
declare@resultvarchar(5000)
select@result=isnull(@result+',','')+品名fromTABLENAMEwhere貨號=@HH
return@result
end
go
OK 了沒有啊?
好吧,再給你一個方法,與你的要求分毫不差:
需要先根據品名或品名ID生成一個按貨號分組的序號,存到臨時表,以最多10個品名為例:
臨時表生成:
SELECT*,SN=(SELECTCOUNT(1)FROMTABLENAMEAWHEREA.品名>=tablename.品名anda.貨號=tablename.貨號)into#tablenameFROMTABLENAME
看看這個臨時表,多出了一個SN(序號),然後用下面的語句查詢:
selectDISTINCTt.貨號,
品名1=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=1),''),
品名2=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=2),''),
品名3=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=3),''),
品名4=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=4),''),
品名5=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=5),''),
品名6=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=6),''),
品名7=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=7),''),
品名8=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=8),''),
品名9=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=9),''),
品名10=isnull((selecttop1a.品名from#tablenameawherea.貨號=t.貨號anda.sn=10),'')
from#tablenamet
看上去復雜,寫起來容易,只需復制 復制 <品名n=....sn=n>10次,然後改品名後綴和SN值即可。
結果:
貨號品名1品名2品名3品名4品名5品名6品名7品名8品名9品名10
1AABABB
2BBC
⑤ sqlserver 時間段交叉查詢語句(最簡短的)
你說的對,少一種情況(ab在起至時間之間的)。
where (起始時間 between a and b) or (截止時間 between a and b) or (a between 起始時間 and截止時間)
⑥ sqlserver中兩個表交叉連接查詢結果有多少列和多少條記錄
X+Y,MN
⑦ SQLSERVER 兩表生成動態交叉表
--靜態SQL
select [商品款號],[品名],[采購價],[零售單價],[顏色],[碼系],
case [序號] when 0 then [數量] else null end "0",
case [序號] when 1 then [數量] else null end "1",
case [序號] when 2 then [數量] else null end "2",
case [序號] when 3 then [數量] else null end "3",
case [序號] when 4 then [數量] else null end "4"
from [出入庫明細]
--動態SQL
declare @sql varchar(8000)
set @sql = 'select [商品款號],[品名],[采購價],[零售單價],[顏色],[碼系]'
select @sql = @sql + ' , case [序號] when ' + seq + ' then [數量] else 0 end "' + seq + '"'
from (select distinct cast([序號] as varchar) seq from [出入庫明細]) as a
set @sql = @sql + ' from [出入庫明細]'
print @sql
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,賦值為資料庫名稱,然後在上面代碼打開指定資料庫,這樣所有的資料庫都可以調用它),當你調用時,採取以下格式:
⑨ 關於sqlserver 的一個查詢, 解決再加50分
這是個交叉表,很容易的。用存儲過程+臨時表就最簡單了。找了半天,終於找到我N年前寫的一個給你參考一下,至少這種是相當靈活的。記得給分,兄弟!
if object_id('dbo.Proc_AP_BY_HPN') is not null
drop procere dbo.Proc_AP_BY_HPN
go
create procere Proc_AP_BY_HPN
@HPN varchar(18) = null
as
create table #temp_list
(
vendor_id varchar(50) not null,
HPN varchar(50) not null,
Currency CHAR(3) null,
Payment varchar(120) null,
Rec_Qty numeric(18,2) not null default 0.00,
Unit_Price float not null default 0.00,
GR_Dt varchar(50) not null
)
insert into #temp_list
(
vendor_id,HPN,Rec_Qty,Unit_Price,GR_Dt)
select a.vendorid,b.itemNo,0.000,Rec_qty, convert(char(4),datepart(yy,Rec_date))+'/'+convert(char(2),datepart(mm,Rec_date))
from base_Recdepot a,base_RecDepotc b
where a.add_id = b.single_id and Itemno like '%'+@hpn
select hpn,max(unitprice) as Unit_Price into #price_List
from ord_item where hpn like '%CK002'
group by hpn
update #temp_list
set unit_price = a.Rec_qty*b.unit_price
from #temp_list a,#price_list b where a.hpn = b.hpn
select a.vendor_id as [Vendor ID],B.description as [Vendor Name],a.Currency,a.Payment, convert(numeric(18,5),sum(a.unit_price)) as Amount,GR_dt
into #temp_final_list
from #temp_list a,ven_cust_mst b where a.vendor_id = b.id
group by a.vendor_id,b.description,a.Currency,a.Payment,GR_dt
--select * from #temp_final_list
declare @sql varchar(8000)
set @sql = 'select [Vendor ID],[Vendor Name],Currency,Payment,'
select @sql = @sql + 'sum(case GR_dt when '''+GR_dt+'''
then Amount else 0 end) as '''+GR_dt+''','
from (select distinct GR_dt from #temp_final_list ) as a
select @sql = left(@sql,len(@sql)-1) + '
from #temp_final_list
group by
[Vendor id],
[Vendor Name],
Currency,Payment
order by [Vendor ID]'
exec(@sql)
drop table #temp_final_list
drop table #price_list
drop table #temp_list
go
Proc_AP_BY_HPN 'CK002'
樓主,我的是全動態的,列是不確定的,也可以用變數的。用SQL CASE 直接寫成是只適用於固定列的情形。
⑩ SQL中進行交差表查詢的方法和代碼
交叉查詢你可以通過兩中方法實現
建表語句:注意資料庫為sqlserver
create table A(aID int,aNum nvarchar(10))
insert into A (aID,aNum) values (1,'a1')
insert into A (aID,aNum) values (2,'a2')
create table B(bID int,bName nvarchar(10))
insert into B (bID,bName) values (1,'b1')
insert into B (bID,bName) values (2,'b2')
insert into B (bID,bName) values (3,'b3')
create table C(ca int,cb int)
insert into C (ca,cb) values (1,2)
insert into C (ca,cb) values (1,3)
insert into C (ca,cb) values (2,1)
insert into C (ca,cb) values (2,3)
第一:通過full join
select aa.*,cc.*,bb.* from A aa
full join B bb on 1=1
full join C cc on cc.ca=aa.aID and cc.cb=bb.bID
得到的結果是
aID aNum ca cb bID bName
----------- ---------- ----------- ----------- ----------- ----------
1 a1 NULL NULL 1 b1
1 a1 1 2 2 b2
1 a1 1 3 3 b3
2 a2 2 1 1 b1
2 a2 NULL NULL 2 b2
2 a2 2 3 3 b3
(6 件処理されました)
第二種方法是 cross join
select N.aid,N.anum,N.ca,T.CB,T.BID,T.BNAME
from
(select a.aid,a.anum,c.ca
from a
right join
c
ON
a.aid=c.ca
) N
CROSS JOIN
(select B.Bid,B.BNAME,c.ca,c.cb
from B
right join
c
ON
B.aid=c.cB) T
結果如上