问题描述
|
SELECT COALESCE (rsu.last_name + \',\' + rsu.first_name + \' \' + rsu.middle_name + \'.\',rsu.last_name + \',\' + rsu.first_name) as student_name,rsu.day_id
FROM roster_school_unattended rsu
GROUP BY student_name
ORDER BY rsu.day_id
不起作用。什么是最优雅的解决方法?
编辑:结果集应该有这样的东西
Muster,Hans | 2011-11-01
Muster,Hans | 2011-11-02
Williams,Clay | 2011-10-01
Williams,Clay | 2011-10-02
首先按名称分组,然后为每个名称排序。
解决方法
编辑:整个事情都被替换了,因为对问题的最新编辑表明不需要GROUP BY ...
没有为“优雅”做任何更改...
SELECT
rsu.last_name + \',\' + rsu.first_name + COALESCE (\' \' + rsu.middle_name + \'.\',\'\') as student_name,rsu.day_id
FROM
roster_school_unattended AS [rsu]
ORDER BY
rsu.last_name + \',\'\'),rsu.day_id
可能会更改“优雅” ...
WITH formatted_rsu AS
(
SELECT rsu.last_name + \',rsu.day_id
FROM roster_school_unattended AS [rsu]
)
SELECT student_name,day_id
FROM formatted_rus
ORDER BY student_name,day_id
另一种可能使用APPLY ...
SELECT formatted_rsu.student_name,rsu.day_id
FROM roster_school_unattended AS [rsu]
CROSS APPLY (SELECT rsu.last_name + \',\'\') as student_name) AS [formatted_rsu]
ORDER BY formatted_rsu.student_name,rsu.day_id
,进行子选择将使您避免键入两次:
select t.student_name,t.day_id
from (
select COALESCE (rsu.last_name + \',\' + rsu.first_name + \' \' + rsu.middle_name + \'.\',rsu.last_name + \',\' + rsu.first_name) as student_name,rsu.day_id
from roster_school_unattended rsu ) t
group by t.student_name
order by t.day_id
但是day_id仍然有问题-分组子句中未包含它,因此如果不使用汇总(例如MAX),就无法选择它。
,您可以使用子查询:
select student_name,day_id
from (SELECT COALESCE (rsu.last_name + \',\' + rsu.first_name) as student_name,rsu.day_id
FROM roster_school_unattended rsu
) as rows
GROUP BY student_name
ORDER BY day_id
,我会去:
SELECT
rsu.last_name
+ \',\' + rsu.first_name
+ COALESCE ( \' \' + rsu.middle_name + \'.\',\'\'
)
AS student_name,rsu.day_id
FROM
roster_school_unattended AS rsu
ORDER BY
rsu.last_name,rsu.first_name,rsu.middle_name,rsu.day_id
,CROSS APPLY
是您为非窗口表达式加别名的朋友:
SELECT this.student_name,MAX(rsu.day_id) AS day_id
FROM roster_school_unattended rsu
CROSS APPLY (
SELECT COALESCE (
rsu.last_name+\',\'+rsu.first_name+\' \'+rsu.middle_name+\'.\',rsu.last_name+\',\'+rsu.first_name
) AS student_name
) this
GROUP BY this.student_name
ORDER BY this.student_name,MAX(rsu.day_id)
(假设SQL2005及更高版本)。