TSQL выбрать из двух строк, которые имеют более высокий приоритет и не является нулевым - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь объединить две строки в одной таблице, в то время как каждая строка имеет приоритет.Интересующее значение - это значение, имеющее приоритет 1, если оно не равно NULL;в противном случае значение с приоритетом 0.

Пример источника данных:TSQL без необходимости явно проверять каждый столбец?

SELECT 
  t1.GroupId,
  ISNULL(t2.Col1, t1.Col1) as Col1,
  ISNULL(t2.Col2, t1.Col2) as Col2,
  ISNULL(t2.Col3, t1.Col3) as Col3,
  ...
  ISNULL(t2.Coln, t1.Coln) as Coln
FROM mytable t1
JOIN mytable t2 ON t1.GroupId = t2.GroupId
WHERE       
    t1.Priority = 0 AND
    t2.Priority = 1

С уважением

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Я разработаю решение ROW_NUMBER (), предложенное @KM, так как IMO - лучшее решение для этого. (В форме CTE для удобства чтения)

WITH cte AS (   
   SELECT
      t1.GroupId,
      t1.Col1,
      t1.Col2,
      ROW_NUMBER() OVER(PARTITION BY t1.GroupId ORDER BY ISNULL(GroupId ,-1) ) AS [row_id]
   FROM
      mytable t1
)
SELECT 
   *
FROM
   cte 
WHERE 
   row_id = 1

Это даст вам строку с самым высоким приоритетом (в соответствии с вашими правилами) для каждого GroupId в mytable.

ROW_NUMBER и RANK - два моих любимых трюка с TSQL. http://msdn.microsoft.com/en-us/library/ms186734.aspx

edit: Еще один мой любимый инструмент - PIVOT / UNPIVOT, который вы можете использовать для транспонирования строк / столбцов, что является еще одним способом решения этой проблемы. http://msdn.microsoft.com/en-us/library/ms177410.aspx

0 голосов
/ 29 марта 2012

Я думаю, что это будет делать то, что вы просите, без использования isnull для каждого столбца

select
   *
from
   mytable t1
where
   priority=(select max(priority) from mytable where groupid=t1.groupid group by groupid)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...