T-SQL - вернуть самый правый ненулевой столбец - PullRequest
5 голосов
/ 16 августа 2011

У меня есть странный сценарий, когда мне нужно вернуть самый правый ненулевой столбец в таблице, структурированной следующим образом:

GL           Q1          Q2          Q3          Q4
1            100         0           0           0
2            100         900         250         0
3            600         100         0           1000

Я ожидаю, что результат будет:

GL           Amount
1            100
2            250
3            1000

Есть ли способ реализовать это как подход на основе множеств, не прибегая к утверждению CASE или аналогичному решению? Производительность будет здесь важна.

Ответы [ 5 ]

11 голосов
/ 16 августа 2011
SELECT
   GL,
   COALESCE( NULLIF(Q4,0), NULLIF(Q3,0), NULLIF(Q2,0), NULLIF(Q1,0) ) as Amount
FROM
   myTable
4 голосов
/ 16 августа 2011

Не существует подхода, основанного на SET, поскольку SQL предназначен для агрегирования по строкам, а не по столбцам.

Я бы действительно ожидал, что CASE будет довольно быстрым ...

CASE WHEN Q4 <> 0 THEN Q4
     WHEN Q3 <> 0 THEN Q3
     WHEN Q2 <> 0 THEN Q2
     WHEN Q1 <> 0 THEN Q1
                  ELSE NULL
END

Однако существует альтернатива с использованием NULL и COALESCE ...

COALESCE(NULLIF(Q4, 0), NULLIF(Q3, 0), NULLIF(Q2, 0), NULLIF(Q1, 0))
1 голос
/ 16 августа 2011

Установить based-ish на основе альфа-сортировки "Q?" (Предполагается, что не все четверти равны 0)

with T as ( 
select GL, Q, VALUE, row_number() over (partition by GL order by Q desc) as row
    from (
        select GL,Q1,Q2,Q3,Q4 from theTable
    ) T
    unpivot (VALUE for Q in (Q1,Q2,Q3,Q4)) as U
    where VALUE <> 0 
)
select * from T
   where row = 1
1 голос
/ 16 августа 2011
SELECT 
COALESCE(NULLIF(Q4,0),NULLIF(Q3,0),NULLIF(Q2,0),NULLIF(Q1,0))
1 голос
/ 16 августа 2011

Здесь правильно использовать регистр.Это наиболее эффективный вариант из доступных.

SELECT GL,
  CASE 
    WHEN Q4 != 0 THEN Q4
    WHEN Q3 != 0 THEN Q3
    WHEN Q2 != 0 THEN Q2
    ELSE Q1
  END
FROM TheTable

Если вам требуется подход, основанный на множестве - вам придется PIVOT, а затем агрегировать по RowNumber.Это медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...