SQL SERVER: заполнение столбца на основе других столбцов - PullRequest
0 голосов
/ 19 октября 2011

У меня есть таблица A: (идентификатор int, matchPID char, PID char, set int, num char, QID char, QStatus char)

ID matchPID   PID    set  num   QID  QStatus 
1  00001230   xx123   1   234  
2  00001229   xx234   1   214
3  00000054   xx654   1   NULL
4  00012000   xx125   2   
5  00A53214   xx321   2   
6  00000100   xx213   2

matchPID всегда (00-xxxxxx) x может бытьchar или int.

теперь мне нужно заполнить OID только одним значением для каждого набора в соответствии с [num].

  1. Если для любого набора существует какое-либо значение в [num], затем заполните OID с PID, где существует [num] для того же набора, и заполните Qstatus = 'fail' в покое.

, поэтому OID может быть заполнен в id 1 или 2. (any1), затем проверьте наименьший matchPID и заполните здесь.таким образом, в этом случае (set1) ожидаемый результат:

ID matchPID   PID    set  num   QID       QStatus 

1  00001230   xx123   1   234   NULL       FAIL
2  00001229   xx234   1   214   xx234      NULL
3  00000054   xx654   1   NULL  NULL       FAIL
  1. , если для какого-либо набора не найдено ни одного [num], тогда выберите наименьший matchPID и заполните QID с PID, а остальные не пройдут.

обратите внимание, что matchPID начинается с 00, а затем может быть 0> 1> 2> ..> A> B> C> .... поэтому ожидаемый результат для set2:

ID matchPID   PID    set  num   QID       QStatus

4  00012000   xx125   2   NULL  NULL      FAIL
5  00A53214   xx321   2   NULL  NULL      FAIL
6  00000100   xx213   2   NULL  xx213     NULL

Спасибо

1 Ответ

1 голос
/ 19 октября 2011

Вы хотели что-то подобное ?:

;WITH setInfo AS (
SELECT [SET], 
    CASE WHEN EXISTS (SELECT 1 FROM tableA b 
                                WHERE b.[set]=a.[set] AND num IS NOT NULL) 
                                THEN 1 ELSE 0 END AS HasNum,
    MIN(matchPID) AS MinMatchPID
FROM tableA a
GROUP BY [SET]
)
UPDATE a SET
QID = CASE WHEN s.HasNum = 0 AND a.matchPID = s.MinMatchPID THEN a.PID
           WHEN s.HasNum = 0 AND a.matchPID != s.MinMatchPID THEN NULL
           WHEN s.HasNum = 1 AND a.matchPID = (SELECT min(matchpid) FROM tableA b
                                     WHERE b.[set] = a.[set]
                                     AND b.num is not null
                                      ) 
                                     THEN a.PID
           ELSE NULL
           END,
QStatus = CASE WHEN s.HasNum = 0 AND a.matchPID = s.MinMatchPID THEN NULL
           WHEN s.HasNum = 0 AND a.matchPID != s.MinMatchPID THEN 'FAIL'
           WHEN s.HasNum = 1 AND a.matchPID = (SELECT min(matchpid) FROM tableA b
                                     WHERE b.[set] = a.[set]
                                     AND b.num is not null
                                      ) 
                                     THEN a.PID
           ELSE 'FAIL'
           END
FROM tableA a
JOIN setInfo s ON s.[set] = a.[set]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...