2016-07-21 2 views
0

мне нужно создать новый столбец, где следующий уважаются:T-SQL: Петля в сазе

  • Если всехOrder_ID в одинID имеет Approved флаг и Denied flag of , then flag Подтвержден. (Пример: ID 1)

  • Если всеOrder_ID в пределах одинID имеют Approved флаг и Denied флаг , тогда как флаг запрещен. (Пример: ID 2)

  • Если некоторыеOrder_ID в пределах одногоID имеют Approved флаг и Denied флаг и другие либо с Approved флагом и Denied флаг или Approved флаг и Denied флаг , затем отметьте это как Утверждено частично. (Пример: ID 3 и 6)

  • Если любогоOrder_ID в пределах одинID имеет Approved флаг и Denied флага независимо от другого Order_ID в пределах ID, тогда флаг как Ошибка. (Пример: ID 4)
  • Если всеOrder_ID в пределах одинID имеют Approved флаг и Denied флаг , тогда как флаг В ожидании подтверждения.(Пример: ID 5)

Это упрощенная таблица, я использую в качестве примера:

**ID  Order_ID Approved Denied 
    1   101   1   0 
    2   201   0   1 
    2   202   0   1 
    1   102   1   0 
    4   401   0   1 
    3   301   0   1 
    6   601   0   1 
    1   103   1   0 
    3   302   1   0 
    3   303   0   0 
    5   501   0   0 
    4   402   1   0 
    6   602   1   0 
    5   502   0   0 
    4   403   1   1 
    5   503   0   0 

и это результат я ожидаю:

**Id  Order_ID Approved Denied Approval_status 
    1   101   1   0  Approved 
    2   201   0   1   Denied 
    2   202   0   1   Denied 
    1   102   1   0  Approved 
    4   401   0   1   Error 
    3   301   0   1 Partially approved 
    6   601   0   1 Partially approved 
    1   103   1   0  Approved 
    3   302   1   0 Partially approved 
    3   303   0   0 Partially approved 
    5   501   0   0  Pending Approval 
    4   402   1   0  Error 
    6   602   1   0 Partially approved 
    5   502   0   0  Pending Approval 
    4   403   1   1  Error 
    5   503   0   0  Pending Approval 

Спасибо много заранее !! Я в основном смущен тем, как цикл в пределах одного ID в заявлении CASE.

+0

Не используйте петлю. Создайте столбец, затем сделайте 3 или 4 обновления, чтобы строить свои бизнес-правила в правильном порядке. ** NO LOOPS IN SQL! ** – Hogan

+0

@hogan Как я могу оставаться только в одном ID? –

+0

У вас нет, работа с наборами означает, что вы применяете изменение ко всем идентификаторам, которые отвечают требованиям. например, если вы группируете по id, вы можете сравнить счетчик (*) с суммой (*), чтобы узнать, является ли поле 1 для каждого элемента. – Hogan

ответ

1

Я возвращаю свой комментарий выше.

WITH CTE AS (
    SELECT 
     COUNT(*) AS NumberOfOrder 
     , SUM(Approved) AS NumberOfApproved 
     , SUM(Denied) AS NumberOfDenied 
     , SUM(IIF(Approved=1 AND Denied=1,1,0)) AS NumberOfError 
     , ID 
    FROM 
     TestTable T1 
    GROUP BY 
     T1.ID 
) 
SELECT 
    T2.* 
    , CASE 
     WHEN CTE.NumberOfError > 0 THEN 'Error' 
     WHEN CTE.NumberOfApproved=CTE.NumberOfOrder THEN 'Approved' 
     WHEN CTE.NumberOfDenied=CTE.NumberOfOrder THEN 'Denied' 
     WHEN CTE.NumberOfApproved>0 OR CTE.NumberOfDenied > 0 THEN 'Partially Approved' 
     ELSE 'Pending Approval' 
    END AS Approval_Status 
FROM 
    TestTable T2 
    JOIN CTE ON T2.ID=CTE.ID