2014-03-30 4 views
0

Вот мой источник данных:SQL поворота сервера с «связями»

+-------+-------+-------+------+ 
| Categ | Nm | Value | Rnk | 
+-------+-------+-------+------+ 
| A  | Tom | 37 | 1 | 
| A  | Joe | 36 | 2 | 
| A  | Eddie | 35 | 3 | 
| B  | Seth | 28 | 1 | 
| B  | Ed | 25 | 2 | 
| B  | Billy | 22 | 3 | 
| C  | Julie | 42 | 1 | 
| C  | Jenny | 41 | 2 | 
| C  | April | 40 | 3 | 
| C  | Mary | 40 | 3 | 
| C  | Laura | 40 | 3 | 
+-------+-------+-------+------+ 

А вот выход я хотел бы произвести:

+------+--------+--------+-------+ 
| Rnk | A | B | C | 
+------+--------+--------+-------+ 
| 1 | Tom | Seth | Julie | 
| 2 | Joe | Ed  | Jenny | 
| 3 | Eddie | Billy | April | 
| 3 | (null) | (null) | Mary | 
| 3 | (null) | (null) | Laura | 
+------+--------+--------+-------+ 

Я использовал следующий подход (который я понять через другие должности может быть выше, чем на самом деле, используя PIVOT) ... и это приводит меня к тому, где я вижу Джули/Дженни/апрель, но не Мэри/Лаура (очевидно, поскольку он тянет MIN в случае «галстука» «).

SELECT Rnk 
, min(CASE WHEN Categ = 'A' THEN Nm END) as A 
, min(CASE WHEN Categ = 'B' THEN Nm END) as B 
, min(CASE WHEN Categ = 'C' THEN Nm END) as C 
FROM Tbl 
GROUP BY Rnk 

Как добраться до моего желаемого выхода?

ответ

3

Ну, если вам нужно несколько строк для каждого ранга, вы не можете агрегировать по рангам или, по крайней мере, по рангам. Таким образом, вычислить ранг-внутри-на-ранг или как следующий запрос вызывает его, sub_rnk:

SELECT Rnk, 
     min(CASE WHEN Categ = 'A' THEN Nm END) as A, 
     min(CASE WHEN Categ = 'B' THEN Nm END) as B, 
     min(CASE WHEN Categ = 'C' THEN Nm END) as C 
FROM (select t.*, row_number() over (partition by categ, rnk order by newid()) as sub_rnk 
     from Tbl t 
    ) t 
GROUP BY rnk, sub_rnk 
ORDER BY rnk; 
+0

Высокого - спасибо – Dylan

 Смежные вопросы

  • Нет связанных вопросов^_^