Группировка по псевдониму - PullRequest
1 голос
/ 23 мая 2011
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

Сначала имя сгруппировано, затем для каждого имени есть сортировка дат.

Ответы [ 5 ]

2 голосов
/ 23 мая 2011

Выполнение выборки позволит вам избежать необходимости вводить ее дважды:

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).

1 голос
/ 23 мая 2011

Вы можете использовать подзапрос:

select student_name, 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
) as rows
GROUP BY student_name
ORDER BY day_id
0 голосов
/ 23 мая 2011

Я бы пошел с:

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
0 голосов
/ 23 мая 2011

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 и выше).

0 голосов
/ 23 мая 2011

РЕДАКТИРОВАТЬ: Вся вещь заменена, так как недавнее редактирование вопроса показывает, что 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.first_name + COALESCE (' ' + rsu.middle_name + '.', ''),
  rsu.day_id


Возможные изменения для «элегантности» ...

WITH formatted_rsu AS
(
  SELECT rsu.last_name + ', ' + rsu.first_name + COALESCE (' ' + rsu.middle_name + '.', '') as student_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 + ', ' + rsu.first_name + COALESCE (' ' + rsu.middle_name + '.', '') as student_name) AS [formatted_rsu]
ORDER BY    formatted_rsu.student_name, rsu.day_id
...