2014-07-01 166 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