sqlserver双排序,sql 并列排序
同一个数据表按照条件,分别进行两种排序,SQLServer
select * from (
成都创新互联是一家专注于成都网站建设、网站制作与策划设计,高邮网站建设哪家好?成都创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:高邮等地区。高邮做网站价格咨询:18980820575
select id,title,notice,begintime,endtime,row_number() over(order by begintime) rn_asc,
row_number() over(order by begintime desc) rn_desc
from table_xxx)t
order by notice,case when notice=0 then rn_asc else rn_desc
sqlserver排序规则的问题
如何区分大小写、全角半角(SQL2000测试通过):
/*
用定义排序规则(Chinese_PRC_CS_AS_WS、Chinese_PRC_BIN)来区分,
介绍两种排序规则:
第一个Chinese_PRC所属区域(中文(香港特别行政区),中文(中华人民共和国),中文(新加坡))
CS(CaseSensitivity缩写):CS 指定区分大小写,CI 指定不区分大小写。
AS(AccentSensitivity缩写):AS 指定区分重音,AI 指定不区分重音。
WS(WidthSensitivity缩写):WS 指定区分大小写,Omitted 指定不区分大小写。(区分全角半角)
BIN:指定使用二进制排序次序。
KanatypeSensitive:KS 指定区分假名类型,Omitted 指定不区分大小写。
_BIN 二进制排序
_CI_AI 不区分大小写、不区分重音、不区分假名类型、不区分宽度
_CI_AI_WS 不区分大小写、不区分重音、不区分假名类型、区分宽度
_CI_AI_KS 不区分大小写、不区分重音、区分假名类型、不区分宽度
_CI_AI_KS_WS 不区分大小写、不区分重音、区分假名类型、区分宽度
_CI_AS 不区分大小写、区分重音、不区分假名类型、不区分宽度
_CI_AS_WS 不区分大小写、区分重音、 不区分假名类型、区分宽度
_CI_AS_KS 不区分大小写、区分重音、区分假名类型、不区分宽度
_CI_AS_KS_WS 不区分大小写、区分重音、区分假名类型、区分宽度
_CS_AI 区分大小写、不区分重音、 不区分假名类型、不区分宽度
_CS_AI_WS 区分大小写、不区分重音、不区分假名类型、区分宽度
_CS_AI_KS 区分大小写、不区分重音、区分假名类型、不区分宽度
_CS_AI_KS_WS 区分大小写、不区分重音、区分假名类型、区分宽度
_CS_AS 区分大小写、区分重音、不区分假名类型、不区分宽度
_CS_AS_WS 区分大小写、区分重音、不区分假名类型、区分宽度
_CS_AS_KS 区分大小写、区分重音、区分假名类型、不区分宽度
_CS_AS_KS_WS 区分大小写、区分重音、区分假名类型、区分宽度
*/
在我的Blog里有举用法例子
SQLSERVER排序问题,求大虾指教
-- 排序查询
select a.badge,a.[name],a.department,a.job,isnull(b.course,'旷考') course,isnull(b.grade,0) grade,b.[order]
from employee a left join training b on a.badge=b.badge
order by b.course,b.grade desc
-- 更新表2的排名(循环)
declare @tid int,@order int,@ctid int,@corder int,@sql varchar(8000)
set @tid = 1
set @order = 1
select top 1 @ctid=tid from training order by tid desc
while (@tid=@ctid)
begin
set @order=1
select @corder=count(*) from training where tid=@tid
while (@order=@corder)
begin
set @sql = 'update training set [order]='+convert(varchar(50),@order)+'
where badge not in (select top '+convert(varchar(50),@order-1)+' badge from training where tid='+convert(varchar(50),@tid)+' order by grade desc)
and tid='+convert(varchar(50),@tid)
exec (@sql)
set @order=@order+1
end
set @tid=@tid+1
end
-- 更新表2的排名(游标)
if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#t') and type='U')
drop table #t
create table #t
(
ftid int,
fbadge int,
[order] int identity(1,1)
)
declare @tid int
declare c1 cursor for select distinct tid from training
open c1
fetch next from c1 into @tid
while @@fetch_status=0
begin
insert into #t(ftid,fbadge)
select a.tid,a.badge from training a where a.tid=@tid order by a.grade desc
update a set a.[order] = b.[order] from training a join #t b on a.tid=b.ftid and a.badge=b.fbadge
truncate table #t
fetch next from c1 into @tid
end
close c1
deallocate c1
drop table #t
写的不好,如果有更好的方法希望贴出来一起学习下。
sqlserver排序
排序可以是升序的 (ASC),也可以是降序的 (DESC)。如果未指定是升序还是降序,就假定为 ASC。
下面的查询返回按 ProductID 升序排序的结果:
代码如下 复制代码
USE AdventureWorks2008R2;
GO
SELECT ProductID, ProductLine, ProductModelID
FROM Production.Product
ORDER BY ProductID;
如果 ORDER BY 子句中指定了多个列,则排序是嵌套的。下面的语句先按产品子类别降序排序 Production.Product 表中的行,然后在每个产品子类别中按 ListPrice 升序排序这些行。
代码如下 复制代码
USE AdventureWorks2008R2;
GO
SELECT ProductID, ProductSubcategoryID, ListPrice
FROM Production.Product
ORDER BY ProductSubcategoryID DESC, ListPrice;
问题
同一个查询的结果集为什麽有时候是按他想要的顺序排列,有时候又不是,或者是在SQL2000里是这个顺序,到了SQL2005/2008又是那个顺序?
其实,只要语句里没有指定“order by”,SQLSERVER并不会按照顺序返回的。有可能你的表里有一个字段已经建立了索引
你想结果集按照那个建立了索引的字段排序,那么你不指定“order by”是没有问题的,因为表的存储顺序就是按照那个字段
的顺序排好序了,所以可以不指定“order by”,但是如果你没有在想排序的那个字段建立索引,或者在SQL2000里建立了
索引,而在SQL2005/2008里没有建立索引,那么就要明确地用“order by”指定。如果你没有指定,哪怕一模一样的查询,
结果集顺序这一次和上一次不一样是很正常的。
sqlserver排序问题
1、查询SQL中的所有表: Select TABLE_NAME FROM 数据库名称.INFORMATION_SCHEMA.TABLES Where TABLE_TYPE='BASE TABLE' 执行之后,就可以看到数据库中所有属于自己建的表的名称 2、查询SQL中所有表及列: Select dbo.sysobjects.name as Table_name, dbo.syscolumns.name AS Column_name FROM dbo.syscolumns INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id Where (dbo.sysobjects.xtype = 'u') AND (NOT (dbo.sysobjects.name LIKE 'dtproperties')) 3、在Sql查询分析器,还有一个简单的查询方法: EXEC sp_MSforeachtable @command1="sp_spaceused '?'" 执行完之后,就可以看到数据库中所有用户表的信息 4、查询总存储过程数:select count(*) 总存储过程数 from sysobjects where xtype='p' 附:xtype类型D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束L = 日志FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程S = 系统表TF = 表函数
TR = 触发器U = 用户表UQ = UNIQUE 约束(类型是 K)V = 视图X = 扩展存储过程 另:在sqlserver中取得某个数据库中所有表名的sql语句 select sysobjects.name from sysobjects.xtype ='U';SELECT name
WHERE (xtype = 'U') 在数据库的sysobjects表里有这个数据库全部表的信息, xtype值为'U'的就是表名 注意:一般通过上述方法获得全部用户表示都会有一个dtproperties表,SQLSERVER 默认它也是用户表,想要从用户表中排出,需要加上限定条件 status0,即:select * from sysobjects where xtype='U' and status0
标题名称:sqlserver双排序,sql 并列排序
本文地址:http://scyanting.com/article/dscigih.html