2013-04-09 1 views
1

Это пример таблицы:В Access, как мне отобразить имя идентификатора и столбца столбца с наибольшим значением в каждой строке?

Table1 
| id | one | two | three | four | five | six | 
|--------------------------------------------| 
| 1| 11| 7|  4|  9|  4| 1| 
| 2| 12| 9|  3|  8| 19| 32| 
| 3| 18| 7|  7|  1| 24| 2| 
| 4| 9| 1|  15|  6|  6| 4| 

В настоящее время запрос я использую на столе заключается в следующем:

SELECT id, Max(colx) AS colWithMax 
FROM (
    SELECT id, one AS Colx From Table1 UNION ALL 
    SELECT id, two AS Colx From Table1 UNION ALL 
    SELECT id, three AS Colx From Table1 UNION ALL 
    SELECT id, four AS Colx From Table1 UNION ALL 
    SELECT id, five AS Colx From Table1 UNION ALL 
    SELECT id, six AS Colx From Table1 
) 
group by id; 

Выход я получаю:

ID | colWithMax 
-- | --------- 
1 |  11 
2 |  32 
3 |  24 
4 |  15 

My questio n - как я могу изменить свой запрос, чтобы мой вывод отображал имя столбца вместо значения в столбце?

Основываясь на примере таблицы желаемый результат будет:

ID | colWithMax 
-- | --------- 
1 | one 
2 | six 
3 | five 
4 | three 

Примечание: У меня есть общее представление о SQL, и я никогда не использовал MS-Access раньше. Пожалуйста, будьте как можно более подробными в своих ответах. Спасибо.

ответ

0

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

select id, 
    if (one > two && one > three && one > four && one > five && one > six, 'one', 
    if (two > three && two > four && two > five && two > six, 'two', 
    if (three > four && three > five && three > six, 'three', 
    if (four > five && four > six, 'four', 
    if (five > six, 'five', 'six'))))) col 
from Table1 

SQL Fiddle Demo

Это на самом деле использует if где доступ использует iif, и это использует &&, где я думаю, что доступ использует AND, но дело в том, что вам не нужно использовать агрегат и group by в вашем запросе.

Вот моя попытка эквивалент доступа:

select id, 
    iif (one > two AND one > three AND one > four AND one > five AND one > six, 'one', 
    iif (two > three AND two > four AND two > five AND two > six, 'two', 
    iif (three > four AND three > five AND three > six, 'three', 
    iif (four > five AND four > six, 'four', 
    iif (five > six, 'five', 'six'))))) col 
from Table1 
+0

Большое спасибо. Это решение сработало для меня. Единственное, что я должен был добавить, было: iif (пять> шесть, «пять», «шесть»))))) ** AS ** col – Kiro

+0

@Kiro - np, рад, что это сработало для вас! Не использовали Access через некоторое время и немного прикрыл его :) – sgeddes

0

вы можете попробовать следующий запрос -

select id, colname from ( 
SELECT id, one AS Colx, 'one' Colname From Table1 UNION ALL 
    SELECT id, two AS Colx, 'Two' Colname From Table1 UNION ALL 
    SELECT id, three AS Colx, 'Three' colname From Table1 UNION ALL 
    SELECT id, four AS Colx, 'four' colname From Table1 UNION ALL 
    SELECT id, five AS Colx, 'Five' colname From Table1 UNION ALL 
    SELECT id, six AS Colx, 'Six' colname From Table1 
) as t1 
where exist (select 1 from (
SELECT id, Max(colx) AS colWithMax 
FROM (
    SELECT id, one AS Colx, 'one' Colname From Table1 UNION ALL 
    SELECT id, two AS Colx, 'Two' Colname From Table1 UNION ALL 
    SELECT id, three AS Colx, 'Three' colname From Table1 UNION ALL 
    SELECT id, four AS Colx, 'four' colname From Table1 UNION ALL 
    SELECT id, five AS Colx, 'Five' colname From Table1 UNION ALL 
    SELECT id, six AS Colx, 'Six' colname From Table1 
) 
group by id) as t2 
where t1.id = t2.id 
and t1.colx = t2.colx) 
; 
0

Просто simpify вещи немного переместить это в его собственный запрос (назовем это то, что вам нравится, но я буду называть его Qry для целей этого ответа. Как вы можете видеть, я добавил колонку для имени столбца, откуда приходит значение.

SELECT id, val, col 
FROM (
    SELECT id, one AS val, 'one' AS col FROM Table1 UNION ALL 
    SELECT id, two AS val, 'two' AS col FROM Table1 UNION ALL 
    SELECT id, three AS val, 'three' AS col FROM Table1 UNION ALL 
    SELECT id, four AS val, 'four' AS col FROM Table1 UNION ALL 
    SELECT id, five AS val, 'five' AS col FROM Table1 UNION ALL 
    SELECT id, six AS val, 'six' AS col FROM Table1 
) AS Qry 

Во второй/новый запрос, который будет использовать один определенный выше сделать что-то вроде

SELECT q1.id, q1.val, q1.col AS colWithMax 
FROM Qry q1 
LEFT JOIN Qry q2 ON q2.id = q1.id 
       AND q2.val > q1.val 
WHERE q2.id IS NULL 

Идея состоит в том, что только значения, у которых нет числа, большего, чем у них, будут иметь соединение, поэтому наибольшее (или максимальное число) должно не иметь «значения объединения», они идентифицируются q2.id IS NULL

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