Использование оператора CASE с функцией ROLL UP - PullRequest
0 голосов
/ 11 июня 2018

Я собираю несколько значений DischargeType в одну категорию под названием «Апелляции».Это работает нормально, но совокупное поле MIN (DateReceived) приводит к тому, что результаты выдают 1 значение DateReceived для каждого типа апелляций, когда я просто хочу его для всей категории апелляций.Я думал, что мог бы просто добавить тот же оператор CASE в предложение GROUP BY, но я не знаю, как это сделать с помощью функции ROLL UP.Значение NULL в последней строке является строкой итогов.Спасибо

<code><PRE>
CREATE PROCEDURE [dbo].[p_ReportMonthlySAEProcessing] 
@StartDate smalldatetime = NULL,
@EndDate smalldatetime = NULL
AS
BEGIN
    SELECT
    CASE  
        WHEN DischargeType = 'dqs' THEN 'Disqualifying Status'
        WHEN DischargeType = 'fraud' THEN 'Fraud'
        WHEN DischargeType = 'id theft' THEN 'ID Theft'
        WHEN DischargeType = 'unenforceable' THEN 'Unenforceable'
        WHEN DischargeType = 'unp' THEN 'Unpaid Refund'
        WHEN DischargeType = 'uns' THEN 'Unauthorized Signature/Payment'
        WHEN DischargeType IN ('atb appeal', 'cls appeal','dqs appeal','id 
        theft appeal','unp appeal','uns appeal') THEN 'Appeals'            
    END AS DischargeType 
   ,SUM(CASE WHEN (DateReceived > @StartDate AND DateReceived < DATEADD(dd, 
1, @EndDate)) THEN 1 ELSE 0 END) AS Claims_Received
   ,SUM(CASE WHEN (DateCompleted > @StartDate AND DateCompleted < 
DATEADD(dd, 1, @EndDate)) THEN 1 ELSE 0 END) AS Claims_Completed
   ,SUM(CASE WHEN DateCompleted IS NULL THEN 1 ELSE 0 END) AS Claims_Pending
   ,MIN(DateReceived) AS [Oldest_Claim]     
FROM 
Claims
GROUP BY 
    DischargeType WITH ROLLUP      
ORDER BY 
    CASE WHEN DischargeType IS NULL THEN 1 ELSE 0 END, DischargeType

Текущие результаты: enter image description here

Желаемые результаты: enter image description here

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вам нужно value построить:

SELECT cc.DischargeType,
       . . .
FROM Claims c CROSS APPLY (
        VALUES (CASE WHEN DischargeType = 'dqs' THEN 'Disqualifying Status'
                     WHEN DischargeType = 'fraud' THEN 'Fraud'
                     WHEN DischargeType = 'id theft' THEN 'ID Theft'
                     WHEN DischargeType = 'unenforceable' THEN 'Unenforceable'
                     WHEN DischargeType = 'unp' THEN 'Unpaid Refund'
                     WHEN DischargeType = 'uns' THEN 'Unauthorized Signature/Payment'
                     WHEN DischargeType IN ('atb appeal', 'cls appeal','dqs appeal','id 
    theft appeal','unp appeal','uns appeal') THEN 'Appeals'            
                END)
      ) cc (DischargeType)
GROUP BY cc.DischargeType WITH ROLLUP;
0 голосов
/ 11 июня 2018

Я бы использовал CTE https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-2017

WITH claimsGrp AS (
   SELECT
    CASE  
        WHEN DischargeType = 'dqs' THEN 'Disqualifying Status'
        WHEN DischargeType = 'fraud' THEN 'Fraud'
        WHEN DischargeType = 'id theft' THEN 'ID Theft'
        WHEN DischargeType = 'unenforceable' THEN 'Unenforceable'
        WHEN DischargeType = 'unp' THEN 'Unpaid Refund'
        WHEN DischargeType = 'uns' THEN 'Unauthorized Signature/Payment'
        WHEN DischargeType IN ('atb appeal', 'cls appeal','dqs appeal','id 
        theft appeal','unp appeal','uns appeal') THEN 'Appeals'            
    END AS DischargeType 
   ,
   CASE WHEN (DateReceived > @StartDate AND DateReceived < DATEADD(dd, 
1, @EndDate)) THEN 1 ELSE 0 END AS Claims_Received
   ,CASE WHEN (DateCompleted > @StartDate AND DateCompleted < 
DATEADD(dd, 1, @EndDate)) THEN 1 ELSE 0 END AS Claims_Completed
   ,CASE WHEN DateCompleted IS NULL THEN 1 ELSE 0 END AS Claims_Pending
   ,DateReceived AS [Oldest_Claim]     
FROM 
Claims)

SELECT claimsGrp.DischargeType,
       SUM(claimsGrp.Claims_Received),
       SUM(claimsGrp.Claims_Completed),
       SUM(claimsGrp.Claims_Pending)
       min([Oldest_Claim])
        FROM claimsGrp
GROUP BY 
    DischargeType WITH ROLLUP      
ORDER BY 
    CASE WHEN DischargeType IS NULL THEN 1 ELSE 0 END, DischargeType
...