当前位置: 代码迷 >> Sql Server >> 求教一个sql语句,关于多字段排序的,该如何解决
  详细解决方案

求教一个sql语句,关于多字段排序的,该如何解决

热度:22   发布时间:2016-04-24 09:36:56.0
求教一个sql语句,关于多字段排序的
材料订单明细表A中,有四个字段id,供应商,时间,所属订单号,项目的要求是先判断'时间'最近的在最上面,然后将'时间'最近的该条记录的'供应商'汇总在一起(但是汇总起来又会破坏'时间'的降序排序),接着再对'所属订单号'进行升序排序。想要实现的效果如图显示的第三种,请问这种效果能实现出来吗?

------解决思路----------------------
请自己整理下哦,时间紧迫。

SELECT 'A' ID ,'2014-11-11' STRDATE,'4' BILLNO INTO #
UNION ALL
SELECT 'A' ID ,'2014-11-10' STRDATE,'8' BILLNO 
UNION ALL
SELECT 'C' ID ,'2014-11-09' STRDATE,'4' BILLNO 
UNION ALL
SELECT 'C' ID ,'2014-11-09' STRDATE,'5' BILLNO 
UNION ALL
SELECT 'A' ID ,'2014-11-08' STRDATE,'7' BILLNO 
UNION ALL
SELECT 'B' ID ,'2014-11-07' STRDATE,'6'  BILLNO 

SELECT * FROM #
ORDER BY ID

SELECT * FROM #
ORDER BY STRDATE DESC


SELECT * INTO #2 FROM # 
SELECT * INTO #1 FROM # WHERE 1=2

DECLARE @RowCount INT
DECLARE @ID NVARCHAR(10)
DECLARE @MaxDate NVARCHAR(10)
SELECT @MaxDate=MAX(STRDATE) FROM #2
SELECT TOP 1 @ID=ID FROM #2 WHERE STRDATE=@MaxDate
WHILE(ISNULL(@MaxDate,'')<>'')
BEGIN
INSERT INTO #1
SELECT * FROM #2 WHERE ID=@ID
ORDER BY STRDATE DESC

DELETE FROM #2 WHERE ID=@ID
SELECT @MaxDate=MAX(STRDATE) FROM #2
SELECT TOP 1 @ID=ID FROM #2 WHERE STRDATE=@MaxDate
END 
SELECT * FROM #1
------解决思路----------------------
SELECT 'A' ID ,'2014-11-11' STRDATE,'4' BILLNO INTO #t
UNION ALL
SELECT 'A' ID ,'2014-11-10' STRDATE,'8' BILLNO 
UNION ALL
SELECT 'C' ID ,'2014-11-09' STRDATE,'4' BILLNO 
UNION ALL
SELECT 'C' ID ,'2014-12-09' STRDATE,'5' BILLNO 
UNION ALL
SELECT 'A' ID ,'2014-11-08' STRDATE,'7' BILLNO 
UNION ALL
SELECT 'B' ID ,'2014-11-07' STRDATE,'6'  BILLNO  

;with cte as(
select ID,MAX(STRDATE) AS MX
from #t
Group by ID
),
cte1 as(
select ID,MX,
row_number()over(order by mx desc) as SN
FROM cte
)
select #t.ID,#t.STRDATE,#t.BILLNO,SN from cte1
JOIN #t ON #t.ID=cte1.ID
Order by SN

drop table #t

------解决思路----------------------
SELECT 'A' ID ,'2014-11-11' STRDATE,'4' BILLNO INTO #t
UNION ALL
SELECT 'A' ID ,'2014-11-10' STRDATE,'8' BILLNO 
UNION ALL
SELECT 'C' ID ,'2014-11-09' STRDATE,'4' BILLNO 
UNION ALL
SELECT 'C' ID ,'2014-12-09' STRDATE,'5' BILLNO 
UNION ALL
SELECT 'A' ID ,'2014-11-08' STRDATE,'7' BILLNO 
UNION ALL
SELECT 'B' ID ,'2014-11-07' STRDATE,'6'  BILLNO  

;with cte as(
select ID,MAX(STRDATE) AS MX
from #t
Group by ID
),
cte1 as(
select ID,MX,
row_number()over(order by mx desc) as SN
FROM cte
)
select #t.ID,#t.STRDATE,#t.BILLNO,SN from cte1
JOIN #t ON #t.ID=cte1.ID
Order by SN asc,STRDATE desc

drop table #t

------解决思路----------------------
WITH table1(id,dt) AS (
    SELECT 'A','2014-11-11' UNION ALL
    SELECT 'A','2014-11-10' UNION ALL
    SELECT 'C','2014-11-09' UNION ALL
    SELECT 'C','2014-12-09' UNION ALL
    SELECT 'A','2014-11-08' UNION ALL
    SELECT 'B','2014-11-07'
)
,o AS (
    SELECT id, MAX(dt) mdt
      FROM table1
  GROUP BY id
)
SELECT t.*
  FROM table1 t
  JOIN o
    ON o.id = t.id
ORDER BY o.mdt DESC, t.id, t.dt DESC

id   dt
---- ----------
C    2014-12-09
C    2014-11-09
A    2014-11-11
A    2014-11-10
A    2014-11-08
B    2014-11-07
  相关解决方案