2014-07-01 173 views
0

我是SQL新手,我有一個關於數據顯示以及如何讓查詢顯示我想要的方式的問題。我們的商務智能人員正在忙於其他項目,所以我們(金融)應該放鬆一下。如果這是相關的,我將把它轉儲到EXCEL中。總結SQL查詢條件

我的查詢中選擇了正確的信息,但我想兩列的SUM (INVOICE.INVAMT),我想一列,是INVOICE.INVAMT(或NULL)時INVOICE.INVDATE小於FUNDEPTPER.STARTDATE之和爲INVOICE.INVAMTINVOICE.INVDATE之列介於FUNDEPTPER.STARTDATEFUNDDEPTPER.STOPDATE之間幷包括(或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

我從來沒有想過'CASE statement'可以了'SUM()中找到' – Charlesliam

+0

謝謝,這真是棒極了。 – user3792102

+0

將'case'語句與聚合相結合 - 「條件聚合」 - 功能非常強大。 –

0

我需要打破你的需求來了解你的詢問。

你的要求 - 兩列的SUM(INVOICE.INVAMT):

  1. INVOICE.INVAMT(或NULL)的總和時INVOICE.INVDATE小於FUNDEPTPER.STARTDATE

    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.INVAMT的總和時INVOICE.INVDATE是 之間並且包括FUNDEPTPER.STARTDATE和FUNDDEPTPER.STOPDATE

    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