A. 怎样知道sqlServer的排序规则
语句:
select
SERVERPROPERTY('Collation')
--查看默认排序规则
select
SERVERPROPERTY('SqlCharSetName')--查看排序使用字符集名称
至于sqlserver的字符集个人认为就是windows的字符集。
排序规则还可以通过SSMS中右键查看数据库属性里的‘维护'。
B. SQLserver排序问题
用row_number()over(partition by t_number order by t_number desc)
C. sqlserver排序
排序可以是升序的
(ASC),也可以是降序的
(DESC)。如果未指定是升序还是降序,就假定为
ASC。
下面的查询返回按
ProctID
升序排序的结果:
代码如下
复制代码
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctLine,
ProctModelID
FROM
Proction.Proct
ORDER
BY
ProctID;
如果
ORDER
BY
子句中指定了多个列,则排序是嵌套的。下面的语句先按产品子类别降序排序
Proction.Proct
表中的行,然后在每个产品子类别中按
ListPrice
升序排序这些行。
代码如下
复制代码
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctSubcategoryID,
ListPrice
FROM
Proction.Proct
ORDER
BY
ProctSubcategoryID
DESC,
ListPrice;
问题
同一...排序可以是升序的
(ASC),也可以是降序的
(DESC)。如果未指定是升序还是降序,就假定为
ASC。
下面的查询返回按
ProctID
升序排序的结果:
代码如下
复制代码
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctLine,
ProctModelID
FROM
Proction.Proct
ORDER
BY
ProctID;
如果
ORDER
BY
子句中指定了多个列,则排序是嵌套的。下面的语句先按产品子类别降序排序
Proction.Proct
表中的行,然后在每个产品子类别中按
ListPrice
升序排序这些行。
代码如下
复制代码
USE
AdventureWorks2008R2;
GO
SELECT
ProctID,
ProctSubcategoryID,
ListPrice
FROM
Proction.Proct
ORDER
BY
ProctSubcategoryID
DESC,
ListPrice;
问题
同一个查询的结果集为什麽有时候是按他想要的顺序排列,有时候又不是,或者是在SQL2000里是这个顺序,到了SQL2005/2008又是那个顺序?
其实,只要语句里没有指定“order
by”,SQLSERVER并不会按照顺序返回的。有可能你的表里有一个字段已经建立了索引
你想结果集按照那个建立了索引的字段排序,那么你不指定“order
by”是没有问题的,因为表的存储顺序就是按照那个字段
的顺序排好序了,所以可以不指定“order
by”,但是如果你没有在想排序的那个字段建立索引,或者在SQL2000里建立了
索引,而在SQL2005/2008里没有建立索引,那么就要明确地用“order
by”指定。如果你没有指定,哪怕一模一样的查询,
结果集顺序这一次和上一次不一样是很正常的。
D. 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
写的不好,如果有更好的方法希望贴出来一起学习下。
E. SqlServer树形结构的深度排序怎么实现
/*
转一个邹老大的例子
*/
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'
--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
F. sqlserver 创建视图失败,原因:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效
sqlserver中创建视图时,as下不能出现order by
其实你要排序的话可以对视图进行排序嘛,没必要在视图创建时候就排序
--创建视图
create view v$_emp_1
as
select * from emp
where emp.sal > (select min(sal) from emp)
--查询视图
select * from v$_emp_1 order by sal--这儿排序不就行了嘛~~~采纳哦
G. sqlserver数据表排序问题
不晓得你这个NewId()方法是怎么写的,我自己也写过一个类似的方法,思路是这样的:
首先,获取数据表的行数。
然后在NewId()方法里int id=行数+1,这样就保证了插入的数据永远排在最后一行。
H. SQLserver 联合查询排序问题
不知道你原来的sql语句啥样子啊。。。
SELECT
ISNULL(sale_item, '总计') AS item,
CASE
WHEN GROUPING(sale_item) = 1
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '总计'
WHEN GROUPING(sale_item) = 0
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '小计'
ELSE
STR(DATEPART(qq, sale_date))
END AS sale_q,
SUM(sale_money) [money]
FROM
sale_report
GROUP BY
sale_item, STR(DATEPART(qq, sale_date)) WITH ROLLUP;
item sale_q money
---- ---------- ----------------------------------------
A 1 180810.00
A 2 182819.00
A 3 184828.00
A 4 184828.00
A 小计 733285.00
B 1 180.00
B 2 455.00
B 3 735.00
B 4 1012.00
B 小计 2382.00
C 1 1398.00
C 2 1426.00
C 3 1457.00
C 4 1457.00
C 小计 5738.00
T 3 100.00
T 小计 100.00
总 总计 741505.00
(18 行受影响)
<hr/>
如果希望 总计、小计显示在上面, 那么 ORDER BY 设置一下.
SELECT
ISNULL(sale_item, '总计') AS item,
CASE
WHEN GROUPING(sale_item) = 1
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '总计'
WHEN GROUPING(sale_item) = 0
AND GROUPING(STR(DATEPART(qq, sale_date))) = 1
THEN '小计'
ELSE
STR(DATEPART(qq, sale_date))
END AS sale_q,
SUM(sale_money) [money]
FROM
sale_report
GROUP BY
sale_item, STR(DATEPART(qq, sale_date)) WITH ROLLUP
ORDER BY
GROUPING(sale_item) desc, item,
GROUPING(STR(DATEPART(qq, sale_date))) desc
item sale_q money
---- ---------- ----------------------------------------
总 总计 741505.00
A 小计 733285.00
A 1 180810.00
A 2 182819.00
A 3 184828.00
A 4 184828.00
B 小计 2382.00
B 1 180.00
B 2 455.00
B 3 735.00
B 4 1012.00
C 小计 5738.00
C 1 1398.00
C 2 1426.00
C 3 1457.00
C 4 1457.00
T 小计 100.00
T 3 100.00
(18 行受影响)
I. sqlserver 排序规则的问题
alter table [表名] alter column [列名] [类型] COLLATE Chinese_PRC_CI_AS
[类型] 最好选用 nvarchar,nchar
存储数据时如果出现乱码,可能情况如下:
1.提交到数据库的字符是乱码
2. 数据库排序规则不支持该字符集
3.数据库表字段的类型设计不合适,最好选用nvarchar,nchar
4.插入字符串时强制存储格式 insert into [表名] ([字段1]) values(N'字符串'),最好在字符串前指定 N