1 SQL分頁查詢,每頁10個數據,取第三頁
A) 如果有id列
select top(10) * from Spider_Hotel
where Spider_Hotel.HotelId not in
( select top (10*2) Spider_Hotel.HotelId from Spider_Hotel)
B) 如果沒有id列
select top (10) * from
(select ROW_NUMBER() over (order by Name) as Row,* from Spider_Hotel)
a
where Row>10*2
C) 如果有id列
select top (10) * from Spider_Hotel
where HotelId >(select max(HotelId)
from (select top (10*2) HotelId from Spider_Hotel order by HotelId) as a
)
2,數據庫刪除重復記錄。
a, 如果有id列 a,b,c 重復
Delete from table where id not in (select max (id) from table group a,b,c)
b, 如果沒有id列a,b,c 重復 .用row_number() over 函數,制造個Id列
With Tab as
(
Select row_number() over (order by a) as Row,a,b,c from table
)
Delete from Tab
Where Row not in (selete max(Row) from Tab group a,b,c)
3,Count函數。
SELECT COUNT(*),COUNT(FNumber),COUNT(FName) FROM T_Employee
COUNT(*)統計的是結果集的總條數,而
COUNT(FName)統計的則是除了結果集中FName 不為空值(也就是不等於NULL)的記錄的總
條數,如果Fname有為空COUNT(*) 不等於COUNT(FNumber)
4,求一公司年齡在20-30,40-60歲這兩個年齡段的人數,行列轉換
select SUM(Young) as Young ,SUM(Old) as Old from (
select
Users_age,
sum(case when Users_age between 1 and 3 then 1 else 0 end) as Young,
sum(case when Users_age between 4 and 6then 1 else 0 end) as Old
from Users
group by Users_age) as s
// 顯示名字,不顯示人數,我感覺數據庫語句是一個一個判斷下去的
select
years,
case when age between 20 and 30 then name else '---' end as [20-30],
case when age between 30 and 40 then name else '---' end as [30-40],
case when age between 40 and 50 then name else '---' end as [40-50]
from info
group by years,name,age
5,連續三天的記錄 (查詢連續三天抽取同一家酒店同一入住時間的免費房的人員記錄)
select Member_Code from
dbo.Member a where
exists
(
select * from Member b
where b.Register_Date = DATEADD(D,1,a.Register_Date) and a.Member_Code=b.Member_Code
)
and
exists
(
select * from Member b
where b.Register_Date = DATEADD(D,2,a.Register_Date) and a.Member_Code=b.Member_Code
)
group by Member_Code
6,查詢表結構 (查詢一個數據庫所有的數據庫表 字段類型 字段大小)
--查詢表結構
select Dense_Rank() over (order by o.name) as table_order, ROW_NUMBER() over (partition by o.id order by o.name) as column_order,
o.name as table_name, c.name as column_name, t.name+'['+ convert(varchar, c.[length])+']' as column_type
from sysobjects o inner join syscolumns c
inner join systypes t on c.xusertype=t.xusertype
on o.id=c.id
where o.xtype='U'
order by o.name
--查詢數據庫表
select * from dbo.sysobjects
where sysobjects.xtype ='U'
--查詢數據庫列
select * from syscolumns
where id=21575115
7,截止今天的銷售額 (一個超市每天都有營業額。列出每天的營業額和截止到每天的總營業額。)
(比如,第一天 營業額 10 總營業額 10,第二天 營業額20 總營業額 30;第二天 營業額 10 總營業額 40)
select dates,(select SUM(moneys) from Table as TT
where TT.dates <= T.dates) from Table as T
8,全局臨時表,防止用戶兩地登錄。
--全局臨時表防止用戶地登錄,但是如果用戶量大,這很可能消耗大量資源。
--用戶登錄,就根據用戶Id創建個臨時表,如果用戶賬戶異地登錄,就會發現
--這張臨時表已經存在,返回,提示登錄不成功。用戶退出系統后,臨時表自動消失。
alter proc gp_findtemptable
@v_userid varchar(6),@i_out int output
as
declare @v_sql varchar(100)
if object_id('tempdb.dbo.##'+@v_userid) is null
begin
set @v_sql = 'create table ##'+@v_userid+'(userid varchar(6))'
exec (@v_sql)
set @i_out = 0
end
else
set @i_out = 1
declare @I int
exec gp_findtemptable 'T00001',@I output
select @I
9,查找指定節點的所有子節點的子節點。
create table os(id int,parentid int,desn varchar(10))
--自己不能是自己的節點,否則進入死循環。
alter function f_cid(@id int)
returns varchar(500)
as
begin
declare @t table(id int,desn varchar(10),parentid int,lev int)
declare @lev int
set @lev=1
insert into @t select *,@lev from os where id=@id
while(@@rowcount>0)
begin
set @lev=@lev+1
insert into @t select a.*,@lev from os a,@t b
where a.parentid=b.id and b.lev=@lev-1
end
declare @cids varchar(500)
select @cids=isnull(@cids+',','')+ltrim(id) from @t order by lev
return @cids
end
go
執行查詢
select *,ids=dbo.f_cid(id) from os
轉載:https://blog.csdn.net/slowlifes/article/details/7973904