Я пытаюсь выполнить общее дедуктивное деление, но проблема возникает, когда у меня есть нулевая строка. Я использую SQL Server 2012.Запрос CTE и Lag
Вот пакет моих текущих результатов.
SuppressionDescription SuppressionPriority SuppressionPriorityOrder TotalRecords RecordsLost RunningTotal
Deceased_Bln 1 1 1376 2 1374
Pivotal Postcode Exclusions 9 2 1376 0 1374
Pivotal 3 Month Decline 11 3 1376 24 1352
Postcode exclusions (Complaints) 12 4 1376 0 1352
Gone Away (from Barcode on returned mail) 15 5 1376 30 1346
Pivotal prospects with a Do Not Mail flag 16 6 1376 234 1112
Email Suppression File 17 7 1376 7 1135
Opt outs & undeliverables from SMS system 18 8 1376 7 1362
Generic Phone Number Suppression 19 9 1376 245 1124
Exclude if not MR, MRS, MISS, MS, NULL 23 10 1376 0 1131
Total Prospects 9999 11 1376 0 1376
С моим запросом вычисляются первые две строки. В общей сложности 1,376 меньше 2 оставляет 1 374, а во второй строке нет RecordsLost, поэтому RunningTotal остается неизменным. Все идет нормально.
Но поскольку строка Row 2 имеет счет 0, это означает, что строка 3 (в то время как у нее есть функция RecordLost of 24) выходит из строя.
Я попытался добавить различные операторы case, чтобы попытаться получить итоговые значения для разных сценариев, но это никогда не работает.
Вот мое заявление:
;WITH CTE AS (SELECT ID, SuppressionTypeID, ContactMethodType, SupplierName, SuppressionDescription
, SuppressionCount, TotalRecords, RecordsLost, SuppressionPriority, SuppressionPriorityOrder
, CASE WHEN SuppressionPriority = 9999
THEN TotalRecords
ELSE TotalRecords - RecordsLost END AS RowDiff
, CASE WHEN RecordsLost = 0
THEN LAG(RecordsLost, 1) OVER (PARTITION BY SupplierName, ContactMethodType ORDER BY SuppressionPriorityOrder)
ELSE RecordsLost END AS RecordsLostRoll
FROM #tmpSup
WHERE SupplierName = 'Freeman Grattan Holdings'
AND ContactMethodType = 'A'
)
SELECT SuppressionTypeID, ContactMethodType, SupplierName, SuppressionDescription
, SuppressionPriority, SuppressionPriorityOrder
, TotalRecords
, RecordsLost
, CASE WHEN SuppressionPriorityOrder = 1
THEN RowDiff
ELSE (LAG(RowDiff, 1, RowDiff)
OVER (PARTITION BY SupplierName, ContactMethodType ORDER BY SuppressionPriorityOrder)) - RecordsLost
END AS RunningTotal
FROM CTE
ORDER BY SupplierName
, ContactMethodType
, SuppressionPriority
Я хотел бы видеть RunningTotal как: 1376 (для общее количество перспектив)
Любые предложения и благодарности заранее.
Не могли бы вы создать [SQL fiidle] (HTTP: // sqlfiddle.com/#!6/5d88f/6) со схемой для нас? –