簡體   English   中英

Sums上的SQL查詢條件

[英]SQL Query Conditions on Sums

我是SQL新手,我對數據的顯示以及如何使查詢以所需的方式顯示有疑問。 我們的BI人員正忙於其他項目,因此我們(財務)可以自行安排工作。 如果相關的話,我將在ODBC中將其轉儲到EXCEL。

我的查詢正在選擇正確的信息,但我希望有兩列用於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

您可以通過條件聚合來做到這一點

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;

該查詢還引入了表別名。 這些使查詢更易於編寫和閱讀。

我需要分解您的需求以了解您的詢問。

您需要-SUM的兩列(INVOICE.INVAMT):

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

    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在FUNDEPTPER.STARTDATE和FUNDDEPTPER.STOPDATE之間且包括INVALICE.INVDATE時,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 between FUNDERTPER.STARTDATE and FUNDDERTPER.STOPDATE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM