首页 > 解决方案 > 与组排名

问题描述

我的table1是这样的

Dept    Class   Dept1   Class1      date
NULL    NULL     a      history     02-2020
NULL    NULL     a      bio         02-2020
a       math    NULL    NULL        02-2020
a       chemi   NULL    NULL        02-2020
a       history NULL    NULL        02-2020
b       PE      NULL    NULL        03-2020
b       Music   NULL    NULL        03-2020
b       Sport   NULL    NULL        03-2020
NULL    NULL     b      Cook        03-2020
c       Psy     NULL    NULL        04-2020

我们可以查询看起来像这样的吗

Dept    Class   Dept1   Class1      date
a       math     a      history     02-2020
a       chemi    a      bio         02-2020
a       history NULL    NULL        02-2020
NULL    NULL    NULL    NULL        02-2020
NULL    NULL    NULL    NULL        02-2020
b       PE      b       Cook        03-2020
b       Music   NULL    NULL        03-2020
b       Sport   NULL    NULL        03-2020
NULL    NULL    NULL    NULL        03-2020
c       Psy     NULL    NULL        04-2020

目标尝试按部门、部门 1 和日期获取记录组,
您可以将任何字段与 nvarchar 或整数一起使用
我的查询但效果不佳

select coalesce(sm.dept, su.dept1) as dept,
               sm.class,
               su.class1,
               sm.date
        from 
                (select distinct w.*, 
                 row_number() over (partition by dept order by [date] asc) as seqnum
                 from table1 w
                 ) sm
          full join
                 (select w.*,
                 row_number() over (partition by dept1 order by [date] asc) as seqnum
                  from table1 w

                 ) su

         on sm.dept = su.dept1 and sm.seqnum = su.seqnum

标签: sqlsql-server

解决方案


我了解您想按日期排序,然后按部门、班级、部门 1、班级 1 列排序。在 SQL Server 中,默认情况下 NULL 出现在顶部。因此,我将 NULL 值替换为 ZZZZZ 以使它们最终出现。您可以将 ZZZZZ 替换为大的 varchar 字段,该字段不会出现在您的 dept、class、dept1、class1 字段中。

DECLARE @dept table(dept varchar(50),class varchar(50),dept1 varchar(50),class1 varchar(50),datev varchar(50))

insert into @dept VALUES
(NULL    ,NULL        ,'a'     ,'history'    ,'02-2020')
,(NULL    ,NULL        ,'a'    , 'bio'        ,'02-2020')
,('a'       ,'math'    ,NULL   , NULL        ,'02-2020')
,('a'       ,'chemi'   ,NULL   , NULL        ,'02-2020')
,(null       ,NULL   ,NULL   , NULL        ,'02-2020')
,(null       ,NULL   ,NULL   , NULL        ,'02-2020')
,('a'       ,'history' ,NULL   , NULL        ,'02-2020')
,('b'       ,'PE'      ,NULL   , NULL        ,'03-2020')
,('b'       ,'Music'   ,NULL   , NULL        ,'03-2020')
,('b'       ,'Sport'   ,NULL   , NULL        ,'03-2020')
,(NULL    ,NULL        ,'b'     ,'Cook'        ,'03-2020')
,(null       ,NULL   ,NULL   , NULL        ,'03-2020')
,('c'       ,'Psy'     ,NULL    ,NULL        ,'04-2020');

SELECT  DEPT, class, dept1, class1, datev 
from
(
SELECT *,ROW_NUMBER() over(order by datev,isnull(dept,'ZZZZZ'),isnull(class,'ZZZZZ'),isnull(dept1,'ZZZZZ'),isnull(class1,'ZZZZZ') ) as rnk FROM @dept
) AS T
order by rnk

+------+---------+-------+---------+---------+
| DEPT |  class  | dept1 | class1  |  datev  |
+------+---------+-------+---------+---------+
| a    | chemi   | NULL  | NULL    | 02-2020 |
| a    | history | NULL  | NULL    | 02-2020 |
| a    | math    | NULL  | NULL    | 02-2020 |
| NULL | NULL    | a     | bio     | 02-2020 |
| NULL | NULL    | a     | history | 02-2020 |
| NULL | NULL    | NULL  | NULL    | 02-2020 |
| NULL | NULL    | NULL  | NULL    | 02-2020 |
| b    | Music   | NULL  | NULL    | 03-2020 |
| b    | PE      | NULL  | NULL    | 03-2020 |
| b    | Sport   | NULL  | NULL    | 03-2020 |
| NULL | NULL    | b     | Cook    | 03-2020 |
| NULL | NULL    | NULL  | NULL    | 03-2020 |
| c    | Psy     | NULL  | NULL    | 04-2020 |
+------+---------+-------+---------+---------+

推荐阅读