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