2015-08-14 2 views
-1

Я пытаюсь выполнить общее дедуктивное деление, но проблема возникает, когда у меня есть нулевая строка. Я использую 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 (для общее количество перспектив)

Любые предложения и благодарности заранее.

+0

Не могли бы вы создать [SQL fiidle] (HTTP: // sqlfiddle.com/#!6/5d88f/6) со схемой для нас? –

ответ

0

Вы можете использовать 'рамку окна' в оконной функции для достижения этой цели:

SELECT 
    SuppressionPriorityOrder, 
    TotalRecords, 
    RecordsLost, 
    TotalRecords - SUM(RecordsLost) OVER 
     (
     PARTITION BY SupplierName, ContactMethodType 
     ORDER BY SuppressionPriorityOrder ROWS UNBOUNDED PRECEDING -- this tells the SUM() to add up all preceding records (including the current row) 
    ) RunningTotal 
FROM 
    (
     SELECT 'Freeman Grattan Holdings' AS SupplierName, 'A' AS ContactMethodType, 1 AS SuppressionPriorityOrder, 1376 AS TotalRecords, 2 AS RecordsLost UNION ALL 
     SELECT 'Freeman Grattan Holdings' AS SupplierName, 'A' AS ContactMethodType, 2 AS SuppressionPriorityOrder, 1376 AS TotalRecords, 0 AS RecordsLost UNION ALL 
     SELECT 'Freeman Grattan Holdings' AS SupplierName, 'A' AS ContactMethodType, 3 AS SuppressionPriorityOrder, 1376 AS TotalRecords, 24 AS RecordsLost UNION ALL 
     SELECT 'Freeman Grattan Holdings' AS SupplierName, 'A' AS ContactMethodType, 4 AS SuppressionPriorityOrder, 1376 AS TotalRecords, 0 AS RecordsLost UNION ALL 
     SELECT 'Freeman Grattan Holdings' AS SupplierName, 'A' AS ContactMethodType, 5 AS SuppressionPriorityOrder, 1376 AS TotalRecords, 30 AS RecordsLost 
    ) x 

Код: link.

+0

AHiggins вы легенда :) – Raymondo

0

Я пытаюсь смоделировать лучшее, что мог, ваши данные. Дайте мне знать, если вам нужны какие-то изменения на sqlFiddle

SQL FIDDLE DEMO

Я использую другой КТР для расчета суммы потерянных записей

WITH 
    LOST AS (
     SELECT 
      SuppressionPriorityOrder, 
      (SELECT SUM(RecordsLost) 
      FROM tmpSup T2 
      WHERE T2.SuppressionPriorityOrder <= T1.SuppressionPriorityOrder) as TotalLost 
     FROM tmpSup T1 
    ) 
SELECT 
    T.*, 
    L.TotalLost, 
    CASE WHEN SuppressionPriority = 9999 
     THEN T.TotalRecords 
     ELSE (T.TotalRecords - L.TotalLost) END AS RunningTotal 
FROM 
    tmpSup T INNER JOIN 
    LOST L ON T.SuppressionPriorityOrder = L.SuppressionPriorityOrder 
+0

Большое спасибо. Первое, что в понедельник, я дам вашему фрагменту кода попробовать – Raymondo

Смежные вопросы