2014-07-01 3 views
0

저는 SQL에 익숙하지 않으며 데이터 표시 및 원하는 방식으로 쿼리를 표시하는 방법에 관한 질문이 있습니다. 우리 BI 사람들은 다른 프로젝트에 몰두하여 우리 (금융)가 여유를 갖게됩니다. 관련이있는 경우 ODBC에서 EXCEL로 덤프합니다.합계에 대한 SQL 쿼리 조건

내 쿼리가 올바른 정보를 선택하는 것입니다하지만 난 SUM (INVOICE.INVAMT)에 대한 두 개의 열을 원하는, 내가하면 INVOICE.INVDATE 미만 FUNDEPTPER.STARTDATE입니다 INVOICE.INVAMT (또는 NULL)의 합 INVOICE.INVAMTINVOICE.INVDATE의 합에 대한 열은 열을 원하는 FUNDEPTPER.STARTDATEFUNDDEPTPER.STOPDATE 사이 (OR NULL)입니다. 총액도 좋을 것입니다.

나는 한 번에 하나씩 할 수 있지만 두 가지 모두 할 수는 없다. 내 일은이 일을 할 수 있다고 말한다.

귀하의 도움에 감사드립니다. 나는 구체적으로 (즉 정확한 쿼리 언어)를 알 필요가 없다. 심지어 높은 수준을 설명 할 수 있다면 그것을 얻을 수 있을지도 모른다. (가능하다면)

내 쿼리 당신이 그것을 원한다면 :

SELECT FUNDERS.CODE, BILLBATCH.BATCH_ID, BILLBATCH.BATCHNO, SUM (INVOICE.INVAMT) AS [TOTAL CURRENT] 
FROM FUNDERS INNER JOIN ORDERS ON FUNDERS.FUNDER_ID= ORDERS.FUNDER_ID  
INNER JOIN INVOICE ON ORDERS.ORDER_ID=INVOICE.ORDER_ID  
INNER JOIN FUNDEPTPER ON FUNDEPTPER.PERIOD_ID = INVOICE.PERIOD_ID  
INNER JOIN BILLBATCH ON BILLBATCH.BATCH_ID= FUNDEPTPER.BATCH_ID  
WHERE BILLBATCH.BATCHNO = '?' AND INVOICE.INVTYPE='Invoice' 
     AND INVOICE.INVDATE BETWEEN FUNDEPTPER.STARTDATE AND FUNDEPTPER.STOPDATE  
GROUP BY FUNDERS.CODE, BILLBATCH.BATCH_ID, BILLBATCH.BATCHNO 

답변

3

조건부 집계

SELECT f.CODE, bb.BATCH_ID, bb.BATCHNO, 
     SUM(i.INVAMT) AS TotalTotal, 
     SUM(case when i.INVDATE BETWEEN fp.STARTDATE AND fp.STOPDATE then i.invamt else 0 
      end) as TotalCurrent 
     SUM(case when i.INVDATE < fp.STARTDATE Athen i.invamt else 0 
      end) as TotalBefore 
FROM FUNDERS f INNER JOIN 
    ORDERS o 
    ON f.FUNDER_ID = o.FUNDER_ID INNER JOIN 
    INVOICE i 
    ON o.ORDER_ID = i.ORDER_ID INNER JOIN 
    FUNDEPTPER fp 
    ON fp.PERIOD_ID = i.PERIOD_ID INNER JOIN 
    BILLBATCH bb 
    ON bb.BATCH_ID= fp.BATCH_ID  
WHERE bb.BATCHNO = '?' AND i.INVTYPE = 'Invoice' 
GROUP BY f.CODE, bb.BATCH_ID, bb.BATCHNO; 

이 쿼리는 테이블 별칭을 소개와 함께이 작업을 수행 할 수 있습니다. 이렇게하면 쿼리를 더 쉽게 작성하고 읽을 수 있습니다.

+0

는 'SUM()에서 찾을 수 있습니다' – Charlesliam

+0

감사합니다, 그것은 큰 일했습니다. – user3792102

+0

'case' 문을 집계 - "조건 집계"와 결합하면 매우 강력합니다. –

0

귀하의 질문을 이해할 필요가 있음을 알아야합니다.

당신이있는 거 요구 사항 - SUM과 두 개의 열 (INVOICE.INVAMT) :

  1. INVOICE.INVDATE이 FUNDEPTPER.STARTDATE보다 작은 INVOICE.INVAMT (또는 NULL)의 합

    INVOICE.INVAMT의 SELECT sum(invoice.invamt) FROM funders INNER JOIN ORDERS ON FUNDERS.FUNDER_ID= ORDERS.FUNDER_ID INNER JOIN INVOICE ON ORDERS.ORDER_ID=INVOICE.ORDER_ID INNER JOIN FUNDEPTPER ON FUNDEPTPER.PERIOD_ID = INVOICE.PERIOD_ID WHERE INVOICE.INVDATE < FUNDEPTPER.STARTDATE;

  2. 합 INVOICE.INVDATE는

    ,617 내지 FUNDEPTPER.STARTDATE FUNDDEPTPER.STOPDATE 포함하고있을 때 나는`사례 statement` 생각하지

    SELECT sum(invoice.invamt) FROM funders INNER JOIN ORDERS ON FUNDERS.FUNDER_ID= ORDERS.FUNDER_ID INNER JOIN INVOICE ON ORDERS.ORDER_ID=INVOICE.ORDER_ID INNER JOIN FUNDEPTPER ON FUNDEPTPER.PERIOD_ID = INVOICE.PERIOD_ID WHERE INVOICE.INVDATE between FUNDERTPER.STARTDATE and FUNDDERTPER.STOPDATE