Исключить записи со значением столбца, начинающимся с '836' - PullRequest
0 голосов
/ 06 июня 2019

Итак, моя последняя проблема - мне нужно исключить записи с номерами претензий, которые начинаются с '836'. Это кажется довольно простым, но ничего из того, что я пробовал, похоже, не работает, так как я все еще получаю номера претензий, начиная с '836'. Я пытался использовать NOT LIKE и NOT IN.

Могу ли я сообщить, что я делаю не так? Я включаю запрос и мои комментарии. Заранее спасибо за ваш вклад.

DECLARE @StartDate AS DateTime = '1/1/2017'

IF OBJECT_ID('tempdb..##ProducerCommBridge') IS NOT NULL
  DROP TABLE ##ProducerCommBridge;

SELECT DISTINCT [ProducerCommBridgeKey]
      ,[PolicyAgreementNumber]
      ,[CommissionStartDate]
      ,[CommissionEndDate]
  INTO ##ProducerCommBridge
FROM [dbo].[DimProducerCommBridge]
;

IF OBJECT_ID('tempdb..##FctLossData') IS NOT NULL
  DROP TABLE ##FctLossData;

CREATE TABLE ##FctLossData (
    [QIPS_LPRG_SID] numeric(10,0) null,
    [PACClaimID] nvarchar(50) NULL,
    [EquipmentID] int null,
    [ClaimID] [int] NOT NULL,
    [ClaimNumber] [varchar](34) NOT NULL,
    [CreateDate] [datetime] NOT NULL,
    [LossDate] [datetime] NOT NULL,
    [ProCloseDate] [datetime] NULL,
    [ProducerCommBridgeKey] [int] NOT NULL,
    [ClaimStatus] [varchar](12) NULL,
    [ContractNumber] [varchar](30) NULL,
    [PolicyID] [varchar](20) NULL,
    [CustomerID] [nvarchar](15) NULL,
    [ProductID] [nvarchar](5) NULL,
    [CatastropheID] [int] NULL,
    [InsuranceClassCode] [varchar](1000) NULL,
    [EquipmentName] [varchar](1000) NULL,
    [EquipmentClassName] [varchar](1000) NULL,
    [EquipmentDescription] [nvarchar](1000) NULL,
    [RegionCode] [nvarchar](2) NULL,
    [CountryCode] [nvarchar](3) NULL,
    [ClaimLossType] [nvarchar](50) NULL,
    [CauseOfLoss] [nvarchar](255) NULL,
    [EnrollmentID] [nvarchar](50) NULL,
    [CoverageID] [int] NULL,
    [CoverageEffectiveDate] [datetime] NULL,
    [CustomerAccountNumber] [nvarchar](50) NULL,
    [PaidLossAmount] [money] NULL,
    [CaseReserveAmount] [money] NULL,
    [RecoveryReserveAmount] [money] NULL,
    [SalvageRecoveryAmount] [money] NULL,
    [SubroRecoveryAmount] [money] NULL,
    [TotalRecoveryAmount] [money] NULL,
    [AllocatedLAEAmount] [money] NULL
)
;

INSERT INTO ##FctLossData

--DECLARE @StartDate AS DateTime = '1/1/2017'

SELECT
  qle.LPRG_SID
  ,lc.PACClaimID
  ,ems.EquipmentID
  ,c.ClaimID
  ,(c.ClaimPrefix + '-' + CONVERT(varchar, c.ClaimNumber)) AS ClaimNumber
  ,CONVERT(date, CreateDate) AS CreateDate
  ,CONVERT(date, c.LossDate) AS LossDate
  ,CASE WHEN DATEPART(hh, EffectiveDate) < 17 then CONVERT(date, EffectiveDate) ELSE CONVERT(date, dateadd(dd, 1, EffectiveDate)) END as ProCloseDate
  ,-1 AS ProducerCommBridgeKey
  ,cs.ClaimStatus
  ,UPPER(LEFT(c.ContractNumber, 10)) AS ContractNumber
  ,CASE WHEN c.ContractNumber IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END AS PolicyID
  ,sCustomerID AS CustomerID
  ,CASE WHEN pro.sProductID = '9095' THEN '1095' ELSE pro.sProductID END AS ProductID
  ,c.CatastropheID
  ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode)))), 'UNKNOWN')  END AS InsuranceClassCode
  ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName)))), 'UNKNOWN')  END AS EquipmentName
  ,CASE WHEN EquipmentClassName IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentClassName)))) END AS EquipmentClassName
  ,CASE WHEN EquipmentDescription IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentDescription)))) END AS EquipmentDescription
  ,RegionCode
  ,CountryCode
  ,CASE WHEN ClaimLossType IS NULL THEN 'Unknown' ELSE ClaimLossType END AS ClaimLossType
  ,CASE WHEN CauseOfLoss IS NULL THEN 'Unknown' ELSE CauseOfLoss END AS CauseOfLoss
  ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_SID) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lc.EnrollmentID) ELSE NULL END AS EnrollmentID
  ,NULL AS CoverageID
  ,NULL AS CoverageEffectiveDate
  ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_LEASE_CODE) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lefs.ContractNumber) ELSE NULL END AS CustomerAccountNumber
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 0 AND TranTypeID = 1 THEN Amount END) AS PaidLossAmount
  ,SUM(CASE WHEN Reserve = 1 AND Recovery = 0 AND TranTypeID = 1 THEN Amount END) AS CaseReserveAmount
  ,SUM(CASE WHEN Reserve = 1 AND Recovery = 1 AND TranTypeID IN (1, 7, 8) THEN Amount END) AS RecoveryReserveAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID = 8 THEN Amount END) AS SalvageRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID = 7 THEN Amount END) AS SubroRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID IN (1, 7, 8) THEN Amount END) AS TotalRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 0 AND TranTypeID = 6 THEN Amount END) AS AllocatedLAEAmount     
  FROM dbo.ExtPACTransaction t
  INNER JOIN dbo.ExtPACClaim c ON t.ClaimID = c.ClaimID
                              --AND c.ClaimNumber NOT LIKE '836%'
  INNER JOIN dbo.ExtPRSDEPolicy pol ON (CASE WHEN [ContractNumber] IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END) = pol.sPolicyID
  INNER JOIN dbo.ExtPRSDECustomer cus ON pol.iCustomerKey = cus.iCustomerKey
  INNER JOIN dbo.ExtPRSDEProduct pro ON pol.iProductKey = pro.iProductKey
  LEFT OUTER JOIN dbo.ExtPACClaimStatus cs ON c.ClaimID = cs.ClaimID
  LEFT OUTER JOIN dbo.ExtJWProductSegment jw ON pro.sProductID = jw.sProductID
  LEFT OUTER JOIN dbo.ExtEMSEquipment ems ON c.EMIEquipmentID = CONVERT(varchar, ems.EquipmentNumber)
  LEFT OUTER JOIN dbo.ExtQIPSClaims qc ON qc.CLAM_PAC_CLAIMID = c.ClaimID
  LEFT OUTER JOIN dbo.ExtQIPSLeaseEnrollment qle ON qle.LPRG_SID = qc.CLAM_LPRG_SID
  LEFT OUTER JOIN dbo.ExtLP2Claim lc ON lc.PACClaimID = c.ClaimID
  LEFT OUTER JOIN dbo.ExtLP2EnrollmentForSearch lefs ON lefs.EnrollmentID = lc.EnrollmentID
  WHERE c.LossDate >= @StartDate
  --AND c.ClaimNumber NOT LIKE '836%' -- To remove FIS claims
  --AND c.ClaimNumber NOT IN (SELECT c2.ClaimNumber FROM ExtPACClaim c2 WHERE ClaimNumber LIKE '836%')
  AND c.isVoided = 0
  AND (pro.sProductID = '9095' OR jw.sProductID IS NOT NULL)
  GROUP BY qle.LPRG_SID
    ,lc.PACClaimID
    ,ems.EquipmentID
    ,c.ClaimID
    ,(c.ClaimPrefix + '-' + CONVERT(varchar, c.ClaimNumber)) 
    ,CONVERT(date, CreateDate) 
    ,CONVERT(date, c.LossDate) 
    ,CASE WHEN DATEPART(hh, t.EffectiveDate) < 17 then CONVERT(date, t.EffectiveDate) ELSE CONVERT(date, dateadd(dd, 1, t.EffectiveDate)) END
    ,cs.ClaimStatus
    , UPPER(LEFT(c.ContractNumber, 10))
    ,CASE WHEN c.ContractNumber IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END 
    ,sCustomerID 
    ,CASE WHEN pro.sProductID = '9095' THEN '1095' ELSE pro.sProductID END 
    ,c.CatastropheID
    ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode)))), 'UNKNOWN')  END
    ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName)))), 'UNKNOWN')  END
    ,CASE WHEN EquipmentClassName IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentClassName)))) END
    ,CASE WHEN EquipmentDescription IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentDescription)))) END
    ,RegionCode
    ,CountryCode
    ,CASE WHEN ClaimLossType IS NULL THEN 'Unknown' ELSE ClaimLossType END
    ,CASE WHEN CauseOfLoss IS NULL THEN 'Unknown' ELSE CauseOfLoss END 
    ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_SID) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lc.EnrollmentID) ELSE NULL END
    ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_LEASE_CODE) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lefs.ContractNumber) ELSE NULL END

  --ORDER BY ClaimNumber DESC
;

--To view records
SELECT *
FROM ##FctLossData
WHERE ClaimNumber LIKE '836%'

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Вы можете попробовать [^] NotIn сопоставление с образцом в предложении LIKE, чтобы отфильтровать значения, начиная с 836. Я дал пример кода ниже для вашей справки. Подробнее о LIKE клаузуле

CREATE TABLE #test(ClaimNumber VARCHAR(34))

INSERT INTO #test values('836789'),('567890'),('423897')

SELECT * FROM #test
WHERE claimNumber LIKE '[^8][^3][^6]%'

Кстати, я вижу, что вы используете CONVERT(VARCHAR, ClaimNumber). Всегда указывайте длину для VARCHAR. Если вы не укажете длину, она будет применять разную длину по умолчанию в разных местах. В случае с CONVERT будет применяться VARCHAR(30). В определении столбца создания таблицы будет применяться VARCHAR(1). Я бы посоветовал вам прочитать об этой TSQL плохой практике

0 голосов
/ 06 июня 2019

Я добавил столбец ClaimNumberWithoutPrefix и фильтр на основе этого.Ваш оригинальный ClaimNumber имеет что-то вроде этого в начале c.ClaimPrefix + '-'.Имейте в виду, что если c.ClaimPrefix is null, то все выражения is null.Чтобы избежать этого, вы можете использовать concat(c.ClaimPrefix + '-', c.ClaimNumber)

SELECT
  qle.LPRG_SID
  ,lc.PACClaimID
  ,ems.EquipmentID
  ,c.ClaimID
  ,(c.ClaimPrefix + '-' + CONVERT(varchar, c.ClaimNumber)) AS ClaimNumber
  ,ClaimNumber as ClaimNumberWithoutPrefix
  ,CONVERT(date, CreateDate) AS CreateDate
  ,CONVERT(date, c.LossDate) AS LossDate
  ,CASE WHEN DATEPART(hh, EffectiveDate) < 17 then CONVERT(date, EffectiveDate) ELSE CONVERT(date, dateadd(dd, 1, EffectiveDate)) END as ProCloseDate
  ,-1 AS ProducerCommBridgeKey
  ,cs.ClaimStatus
  ,UPPER(LEFT(c.ContractNumber, 10)) AS ContractNumber
  ,CASE WHEN c.ContractNumber IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END AS PolicyID
  ,sCustomerID AS CustomerID
  ,CASE WHEN pro.sProductID = '9095' THEN '1095' ELSE pro.sProductID END AS ProductID
  ,c.CatastropheID
  ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode)))), 'UNKNOWN')  END AS InsuranceClassCode
  ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName)))), 'UNKNOWN')  END AS EquipmentName
  ,CASE WHEN EquipmentClassName IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentClassName)))) END AS EquipmentClassName
  ,CASE WHEN EquipmentDescription IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentDescription)))) END AS EquipmentDescription
  ,RegionCode
  ,CountryCode
  ,CASE WHEN ClaimLossType IS NULL THEN 'Unknown' ELSE ClaimLossType END AS ClaimLossType
  ,CASE WHEN CauseOfLoss IS NULL THEN 'Unknown' ELSE CauseOfLoss END AS CauseOfLoss
  ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_SID) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lc.EnrollmentID) ELSE NULL END AS EnrollmentID
  ,NULL AS CoverageID
  ,NULL AS CoverageEffectiveDate
  ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_LEASE_CODE) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lefs.ContractNumber) ELSE NULL END AS CustomerAccountNumber
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 0 AND TranTypeID = 1 THEN Amount END) AS PaidLossAmount
  ,SUM(CASE WHEN Reserve = 1 AND Recovery = 0 AND TranTypeID = 1 THEN Amount END) AS CaseReserveAmount
  ,SUM(CASE WHEN Reserve = 1 AND Recovery = 1 AND TranTypeID IN (1, 7, 8) THEN Amount END) AS RecoveryReserveAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID = 8 THEN Amount END) AS SalvageRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID = 7 THEN Amount END) AS SubroRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID IN (1, 7, 8) THEN Amount END) AS TotalRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 0 AND TranTypeID = 6 THEN Amount END) AS AllocatedLAEAmount     
  FROM dbo.ExtPACTransaction t
  INNER JOIN dbo.ExtPACClaim c ON t.ClaimID = c.ClaimID
                              --AND c.ClaimNumber NOT LIKE '836%'
  INNER JOIN dbo.ExtPRSDEPolicy pol ON (CASE WHEN [ContractNumber] IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END) = pol.sPolicyID
  INNER JOIN dbo.ExtPRSDECustomer cus ON pol.iCustomerKey = cus.iCustomerKey
  INNER JOIN dbo.ExtPRSDEProduct pro ON pol.iProductKey = pro.iProductKey
  LEFT OUTER JOIN dbo.ExtPACClaimStatus cs ON c.ClaimID = cs.ClaimID
  LEFT OUTER JOIN dbo.ExtJWProductSegment jw ON pro.sProductID = jw.sProductID
  LEFT OUTER JOIN dbo.ExtEMSEquipment ems ON c.EMIEquipmentID = CONVERT(varchar, ems.EquipmentNumber)
  LEFT OUTER JOIN dbo.ExtQIPSClaims qc ON qc.CLAM_PAC_CLAIMID = c.ClaimID
  LEFT OUTER JOIN dbo.ExtQIPSLeaseEnrollment qle ON qle.LPRG_SID = qc.CLAM_LPRG_SID
  LEFT OUTER JOIN dbo.ExtLP2Claim lc ON lc.PACClaimID = c.ClaimID
  LEFT OUTER JOIN dbo.ExtLP2EnrollmentForSearch lefs ON lefs.EnrollmentID = lc.EnrollmentID
  WHERE c.LossDate >= @StartDate
  --AND c.ClaimNumber NOT LIKE '836%' -- To remove FIS claims
  --AND c.ClaimNumber NOT IN (SELECT c2.ClaimNumber FROM ExtPACClaim c2 WHERE ClaimNumber LIKE '836%')
  AND c.isVoided = 0
  AND (pro.sProductID = '9095' OR jw.sProductID IS NOT NULL)
  GROUP BY qle.LPRG_SID
    ,lc.PACClaimID
    ,ems.EquipmentID
    ,c.ClaimID
    ,(c.ClaimPrefix + '-' + CONVERT(varchar, c.ClaimNumber)) 
    ,ClaimNumber
    ,CONVERT(date, CreateDate) 
    ,CONVERT(date, c.LossDate) 
    ,CASE WHEN DATEPART(hh, t.EffectiveDate) < 17 then CONVERT(date, t.EffectiveDate) ELSE CONVERT(date, dateadd(dd, 1, t.EffectiveDate)) END
    ,cs.ClaimStatus
    , UPPER(LEFT(c.ContractNumber, 10))
    ,CASE WHEN c.ContractNumber IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END 
    ,sCustomerID 
    ,CASE WHEN pro.sProductID = '9095' THEN '1095' ELSE pro.sProductID END 
    ,c.CatastropheID
    ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode)))), 'UNKNOWN')  END
    ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName)))), 'UNKNOWN')  END
    ,CASE WHEN EquipmentClassName IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentClassName)))) END
    ,CASE WHEN EquipmentDescription IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentDescription)))) END
    ,RegionCode
    ,CountryCode
    ,CASE WHEN ClaimLossType IS NULL THEN 'Unknown' ELSE ClaimLossType END
    ,CASE WHEN CauseOfLoss IS NULL THEN 'Unknown' ELSE CauseOfLoss END 
    ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_SID) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lc.EnrollmentID) ELSE NULL END
    ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_LEASE_CODE) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lefs.ContractNumber) ELSE NULL END

  --ORDER BY ClaimNumber DESC
;

--To view records
SELECT *
FROM ##FctLossData
WHERE ClaimNumberWithoutPrefix LIKE '836%'
...