2017-08-09 131 views
0
declare @result table (FirstFieldID int, FirstFieldIDName varchar(100), SecondFieldID int, SecondFieldName varchar(100),ObjectID int, ObjectName varchar(100), SubSort int ,TotalStudents int) 
insert into @result 
     select 1000003, 'Gender',    1000125, 'Female',    -1 ,'-1',   -4, 3 
union select 1000003, 'Gender',    1000125, 'Female',    220 ,'Grade 12', -3, 2 
union select 1000003, 'Gender',    1000125, 'Female',    200 ,'Grade 10', -3, 1 
union select 1000003, 'Gender',    1000126, 'Male',     -1 ,'-1',   -4, 5 
union select 1000003, 'Gender',    1000126, 'Male',     210 ,'Grade 11', -3, 3 
union select 1000003, 'Gender',    1000126, 'Male',     220 ,'Grade 12', -3, 1 
union select 1000003, 'Gender',    1000126, 'Male',     140 ,'Grade 4',  -3, 1 
union select 1000021, 'Title I Indicator', 1000380, 'Title I Indicator', -1,  '-1',  -4, 7 
union select 1000021, 'Title I Indicator', 1000380, 'Title I Indicator', 210 ,'Grade 11', -3, 3 
union select 1000021, 'Title I Indicator', 1000380, 'Title I Indicator', 220 ,'Grade 12', -3, 3 
union select 1000021, 'Title I Indicator', 1000380, 'Title I Indicator', 200 ,'Grade 10', -3, 1 
union select 1000010, 'Birth Country',  1000285, 'US',     -1 ,'-1',   -4, 4 
union select 1000010, 'Birth Country',  1000285, 'US',     210 ,'Grade 11', -3, 2 
union select 1000010, 'Birth Country',  1000285, 'US',     220 ,'Grade 12', -3, 2 

select * from @result 
+--------------+-------------------+---------------+-------------------+----------+------------+---------+---------------+ 
| FirstFieldID | FirstFieldIDName | SecondFieldID | SecondFieldName | ObjectID | ObjectName | SubSort | TotalStudents | 
+--------------+-------------------+---------------+-------------------+----------+------------+---------+---------------+ 
|  1000003 | Gender   |  1000125 | Female   |  -1 | -1   |  -4 |    3 | 
|  1000003 | Gender   |  1000125 | Female   |  220 | Grade 12 |  -3 |    2 | 
|  1000003 | Gender   |  1000125 | Female   |  200 | Grade 10 |  -3 |    1 | 
|  1000003 | Gender   |  1000126 | Male    |  -1 | -1   |  -4 |    5 | 
|  1000003 | Gender   |  1000126 | Male    |  210 | Grade 11 |  -3 |    3 | 
|  1000003 | Gender   |  1000126 | Male    |  220 | Grade 12 |  -3 |    1 | 
|  1000003 | Gender   |  1000126 | Male    |  140 | Grade 4 |  -3 |    1 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  -1 | -1   |  -4 |    7 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  210 | Grade 11 |  -3 |    3 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  220 | Grade 12 |  -3 |    3 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  200 | Grade 10 |  -3 |    1 | 
|  1000010 | Birth Country  |  1000285 | US    |  -1 | -1   |  -4 |    4 | 
|  1000010 | Birth Country  |  1000285 | US    |  210 | Grade 11 |  -3 |    2 | 
|  1000010 | Birth Country  |  1000285 | US    |  220 | Grade 12 |  -3 |    2 | 
+--------------+-------------------+---------------+-------------------+----------+------------+---------+---------------+ 

目前我的数据如上所述。 当ObjectID和ObjectName为-1时,TotalStudents将按组中的降序排列。否则,ObjectName是升序。 期待下面的数据。如何根据条件对多列进行排序

+--------------+-------------------+---------------+-------------------+----------+------------+---------+---------------+ 
| FirstFieldID | FirstFieldIDName | SecondFieldID | SecondFieldName | ObjectID | ObjectName | SubSort | TotalStudents | 
+--------------+-------------------+---------------+-------------------+----------+------------+---------+---------------+ 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  -1 | -1   |  -4 |    7 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  200 | Grade 10 |  -3 |    1 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  210 | Grade 11 |  -3 |    3 | 
|  1000021 | Title I Indicator |  1000380 | Title I Indicator |  220 | Grade 12 |  -3 |    3 | 
|  1000003 | Gender   |  1000126 | Male    |  -1 | -1   |  -4 |    5 | 
|  1000003 | Gender   |  1000126 | Male    |  140 | Grade 4 |  -3 |    1 | 
|  1000003 | Gender   |  1000126 | Male    |  220 | Grade 12 |  -3 |    1 | 
|  1000003 | Gender   |  1000126 | Male    |  210 | Grade 11 |  -3 |    3 | 
|  1000010 | Birth Country  |  1000285 | US    |  -1 | -1   |  -4 |    4 | 
|  1000010 | Birth Country  |  1000285 | US    |  210 | Grade 11 |  -3 |    2 | 
|  1000010 | Birth Country  |  1000285 | US    |  220 | Grade 12 |  -3 |    2 | 
|  1000003 | Gender   |  1000125 | Female   |  -1 | -1   |  -4 |    3 | 
|  1000003 | Gender   |  1000125 | Female   |  200 | Grade 10 |  -3 |    1 | 
|  1000003 | Gender   |  1000125 | Female   |  220 | Grade 12 |  -3 |    2 | 
+--------------+-------------------+---------------+-------------------+----------+------------+---------+---------------+ 

谢谢。

+2

https://ozh.github.io/ascii-tables/使ASCII表从你的投入将是asier阅读。 – xQbert

+0

['ORDER BY'](https://docs.microsoft.com/zh-cn/sql/t-sql/queries/select-order-by-clause-transact-sql)和['CASE'](https ://docs.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql)应该这样做。对这些术语(和SQL)的搜索将提供大量结果。 – HABO

+0

尝试了很多方法,请求发布查询 –

回答

0

CASE WHEN statement for ORDER BY clause

SELECT * 
FROM TABLE 
ORDER BY 
CASE WHEN ObjectID = -1 AND ObjectName = -1 THEN TotalStudents END DESC 
CASE WHEN ObjectID <> -1 AND ObjectName <> -1 THEN ObjectName END ASC 

您正在寻找这样的事情?

+0

谢谢。 但预期产量不同。 –

+1

根据[数据类型优先顺序](https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-precedence-transact-sql),“ObjectName”将为转换为“INT”进行比较。对于像“11年级”这样的价值观来说,这不太可能。 – HABO

+0

@HABO,我尝试了下面的内容,我可以得到50%的正确率。 从FirstResultID = -1和ObjectID = -1和SecondFieldID = -1开始按#ResultTable排序,然后TotalStudents结束desc,当FirstFieldID!= -1和ObjectID = -1且SecondFieldID!= -1时,则TotalStudents结束desc,当FirstFieldID!= -1和ObjectID!= -1时,则SecondFieldID结束asc 它不符合我的要求。 –

0

我认为你正在寻找查询象下面这样:

Select * from #sortData 
order by case when objectid =-1 and objectname = '-1' then row_number() over(order by TotalStudents) 
     when objectid <> -1 then row_number() over(order by ObjectName asc) end desc   

仍不能确定你由内而外组是什么意思?团队如何进行排序?

+0

如果ObjectID = -1且ObjectName = -1,则它是与FirstFieldIDName和SecondFieldName相关的基础ObjectName的标头。 –

+0

在哪个序列中? –

+0

如果ObjectID = -1且ObjectName = -1,那么** TotalStudents **将降序并且ObjectID!= - 1和ObjectName!= -1为相应的FirstFieldIDName和SecondFieldName,然后** TotalStudents **将升序 –

0

尝试下面,让我知道,如果它的工作原理:

select * ,row_number() over(partition by flag order by totalstudents desc) 
as rn from( 
      select *, 
      case when objectid=-1 and objectname='-1' then 'Des' else 'Asc' 
      end as flag 
      from result 
     )a 
    where flag='Des' 
    union all 
    select * ,row_number() over(partition by flag order by totalstudents) as 
    rn1 from( 
      select *, 
      case when objectid=-1 and objectname='-1' then 'Des' else 'Asc' 
      end as flag 
      from result 
     )a 
    where flag='Asc' 
+0

此处的排序仅基于studentid完成。您需要根据您的要求在row_number()子句中找出​​分组和排序 – Aparna

+0

谢谢。 但我上面发布的预期结果是不同的。 我期待与我发布的结果相同。 –

相关问题