2016-02-16 2 views
0

T-SQL Я подключаю таблицу сервисов к таблице платежей. Я использую MAX, AVG для платежей_rec'd и allowed_ amount. Мне нужно Баланс по последнему номеру строки за услугу из таблицы PayApp. Иногда платежи перечисляются, а затем вычитаются, поэтому баланс MIN не работает. Я думаю о inline select, но не могу использовать встроенную функцию inline.Использование агрегатной функции в операторе выбора строки

SELECT DISTINCT [CDCLSVC].[RECNUM]  
,[CDCLSVC].[ID]  
,[CDCLSVC].[CLIENT_ID]  
,[CDCLIENT].[CASE_NUM]  
,[CDCLSVC].[UNIT_ID]  
,[CDCLSVC].[SUB_UNIT_ID]  
,[CDCLSVC].[SVC_ID]  
,[CDCLSVC].[EMP_ID]  
,[CDCLSVC].[BEG_DATE]  
,UPPER([CAEMP].[SORT_NAME]) as Employee  
,ISNULL([CDCLSVC].[EXTENDED_PRICE],0) As ExtendedPrice  
,ISNULL([CDCLSVC].[BALANCE],0) As Balance   
,ISNULL(MAX([CDPAYAPP].[ALLOWED_AMT]),0) AS AllowedAmount 
,ISNULL(MAX([CDPAYAPP].[ADJ_AMT]),0)As AdjustedAmount 
,ISNULL(SUM([CDPAYAPP].[PAY_APPLIED_AMT]),0)As PaymentApplied 
,ISNULL(MAX([CDPAYAPP].[WRITE_OFF_AMT]),0)AS WriteOff 
,ISNULL(MIN([CDPAYAPP].[SVC_BALANCE]),0) AS SvcBalance 
,UPPER([CDPLACE].[DESC]) as Location  

FROM [AnaDEV].[dbo].[CDCLSVC]  
INNER JOIN [CAEMP] ON [CDCLSVC].[EMP_ID] = [CAEMP].[ID]  
INNER JOIN [CDCLIENT] ON [CDCLSVC].[CLIENT_ID] = [CDCLIENT].[ID]  
INNER JOIN [CDPLACE] ON [CDCLSVC].[PLACE_ID] = [CDPLACE].[ID]  
INNER JOIN [CDPAYAPP] ON [CDPAYAPP].[CLSVC_ID] = [CDCLSVC].[ID] 

WHERE [CDCLSVC].[BEG_DATE] between '2015-07-01' and DATEADD(DAY,- 
    (DATEPART(DAY, getdate())),GETDATE()) 

GROUP BY CDCLSVC.RECNUM,CDCLSVC.ID,CDCLSVC.CLIENT_ID, 
     CDCLIENT.CASE_NUM,CDCLSVC.UNIT_ID, CDCLSVC.SUB_UNIT_ID, 
     CDCLSVC.SVC_ID,CDCLSVC.EMP_ID, CDCLSVC.BEG_DATE, CAEMP.SORT_NAME, 
     CDCLSVC.EXTENDED_PRICE,CDCLSVC.BALANCE, [CDPLACE].[DESC] 

ORDER BY [CDCLIENT].[CASE_NUM], [CDCLSVC].[ID] 
+3

Почему 'SELECT DISTINCT' когда' GROUP BY'? – jarlh

+0

Используемые теги dbms. Несколько конструкций, не связанных с ANSI SQL ... – jarlh

+0

@sagi, только что заметили ... Уже отредактированы. – jarlh

ответ

0

У меня есть таблица услуг (CDCLSVC) для небольшой медицинской клиники. У каждой службы есть много платежей/корректировок (PAYAPP). Поэтому у меня есть отношения от одного до многих. У меня также есть справочная таблица Clinicians и другая для клиентов. Цель состоит в том, чтобы сгруппировать услуги клиницистом, затем клиентом и иметь одну строку за услугу. Это было легко агрегировать таблицу PAYAPP с помощью SUM, MIN, MAX. Проблема заключалась в том, что Баланс в таблице PAYAPP был похож на чековую книжку, и мне просто нужна последняя запись.

PAYAPP 
ROWNUM SVC PRICE ADJUSTMENT WRITE-OFF PAYMENTS BALANCE 
1  001 $100  $25       $75 
2  001 $100       $10  $65 
3  001 $100       $50  $15 
4  001 $100    $15     $0 

КАЖДЫЙ SERVICE MAX (ЦЕНА) SUM (РЕГУЛИРОВКА) MAX (WRITE-OFF) SUM (ОПЛАТА)

Проблема получения окончательного баланса, который я сделал подзаконным запрос после того, как левое внешнее соединение ,

SELECT CDCLSVC.ID AS SERVICE_ID 
     --,CDPAYAPP.[ID] AS CDPAYAPP_ID 
     ,CDCLSVC.[CLIENT_ID] 
     ,CDPAYAPP.[CLSVC_ID] 
     ,ISNULL(CDCLSVC.[EXTENDED_PRICE],0) AS EXTENTED_PRICE 
     ,ISNULL(CDCLSVC.[BALANCE],0) AS BALANCE 
     ,ISNULL(MAX(CDPAYAPP.[ALLOWED_AMT]),0) AS AllowedAmt 
     ,ISNULL(MAX(CDPAYAPP.[ADJ_AMT]),0) AS AdjAmt 
     ,ISNULL(MAX(CDPAYAPP.[WRITE_OFF_AMT]),0)AS WriteOff 
     ,ISNULL(SUM(CDPAYAPP.[PAY_APPLIED_AMT]),0)AS AppliedAmt 
     ,ISNULL(TBL1.SVC_BALANCE,0) AS SVC_BALANCE 
     ,CDCLSVC.[EMP_ID] 
     ,CDCLSVC.[PLACE_ID] 
     ,CDCLSVC.[BEG_DATE] 
     ,CDCLSVC.[UNIT_ID] 
     ,CDCLSVC.[SUB_UNIT_ID] 
    FROM [AnaDEV].[dbo].[CDCLSVC] 

    LEFT OUTER JOIN CDPAYAPP 
    ON CDCLSVC.ID = CDPAYAPP.CLSVC_ID 

LEFT OUTER JOIN 
      (SELECT SVC_BALANCE 
      ,CLSVC_ID 
      FROM CDPAYAPP 
      WHERE CDPAYAPP.RECNUM IN 
       (SELECT MAX([RECNUM]) 
        FROM [AnaDEV].[dbo].[CDPAYAPP] 
        GROUP BY CLSVC_ID)) AS TBL1 

      ON TBL1.CLSVC_ID = CDPAYAPP.CLSVC_ID 

    WHERE [CDCLSVC].[BEG_DATE] between '2015-07-01' and DATEADD(DAY,-(DATEPART(DAY, getdate())),GETDATE()) 
    GROUP BY CDCLSVC.ID,CDCLSVC.[CLIENT_ID],CDPAYAPP.CLSVC_ID,CDCLSVC. 
      [EXTENDED_PRICE],CDCLSVC.[BALANCE],CDCLSVC.[EMP_ID] 
     ,CDCLSVC.[BEG_DATE],TBL1.SVC_BALANCE, CDCLSVC.PLACE_ID 
     ,CDCLSVC.[UNIT_ID] ,CDCLSVC.[SUB_UNIT_ID] 
    ORDER BY CDCLSVC.BEG_DATE DESC -- CHECKING THE WHERE CLAUSE 
Смежные вопросы