Necesito crear una columna Type. Si PolicyNumber tiene un Premium negativo, la columna Type debe tener el valor 1 Y Si la SUMA de Premium para el mismo PolicyNumber es <= 0, entonces debería ser 1 para ambos PolicyNumber

PolicyNumber  AgentName   Premium   Transaction
   A           Brien       1,000     New Business
   A           Brien      -1,000     Cancelled
   B           Michael     500       New Business
   C           David       600       New Business
   D           Tom         800       New Business
   D           Tom        -800       Endorsement

Resultado deseable:

 PolicyNumber  AgentName   Premium   Transaction      Type
   A           Brien       1,000     New Business      1
   A           Brien      -1,000     Cancelled         1
   B           Michael     500       New Business      0
   C           David       600       New Business      0
   D           Tom         800       New Business      1
   D           Tom        -800       Endorsement       1
0
Serdia 19 ago. 2017 a las 00:41

3 respuestas

La mejor respuesta

Usando un caso podemos establecer este valor mediante el uso de una o y una selección de consulta correlacionada.

SELECT PolicyNumber
     , AgentName
     , Premium
     , [Transaction]
     , Case when Premium < 0 OR (SELECT sum(B.Premium) 
                                 FROM tblName B 
                                 WHERE B.PolicyNumber = A.PolicyNumber) <= 0 then 1 else 0 end as Type
FROM tblName A

Aunque esta selección línea por línea puede ser lenta. puede ser mejor obtener los totales en una subconsulta.

SELECT A.PolicyNumber
     , A.AgentName
     , A.Premium
     , A.[Transaction]
     , Case when A.Premium < 0 OR B.SP <=0 then 1 else 0 end as Type
FROM tblName A
INNER JOIN (SELECT sum(Premium) SP, PolicyNumber 
            FROM  tblName 
            GROUP BY PolicyNumber) B
 on A.PolicyNumber = B.Policy_Number
3
xQbert 18 ago. 2017 a las 21:57
select t.*, case when Premium < 0 then 1 when s <= 0 then 1 else 0 end as type from (
    select your_table.*, sum(Premium) over(partition by PolicyNumber) as s from your_table
) t
1
Oto Shavadze 18 ago. 2017 a las 21:53

Pruebe esto (servidor SQL 2008 +)

With policyData as(
Select policyNumber,agentName,Premium, transaction, sum(premium) over (partition by policyNumber) sumPremium from yourTable
)
Select policyNumber, agentName, premium, transaction, case when premium<0 or sumPremium<=0 then 1 Else 0 End as type from policyData
2
Eid Morsy 18 ago. 2017 a las 21:55