[英]SQL Query Conditions on Sums
I am new to SQL and I have a question regarding the display of data and how to get the query to display the way I want. 我是SQL新手,我对数据的显示以及如何使查询以所需的方式显示有疑问。 Our BI people are busy on other projects so we (finance) are left to pick up the slack.
我们的BI人员正忙于其他项目,因此我们(财务)可以自行安排工作。 I am going to dump this in a ODBC to EXCEL, if that is relevant.
如果相关的话,我将在ODBC中将其转储到EXCEL。
My Query is selecting the correct information but I want two columns for the SUM (INVOICE.INVAMT)
, I want a column that is the sum of INVOICE.INVAMT
(or NULL) when INVOICE.INVDATE
is less than FUNDEPTPER.STARTDATE
and a column for the sum of INVOICE.INVAMT
when INVOICE.INVDATE
is between and including FUNDEPTPER.STARTDATE
and FUNDDEPTPER.STOPDATE
, (OR NULL). 我的查询正在选择正确的信息,但我希望有两列用于
SUM (INVOICE.INVAMT)
,当INVOICE.INVDATE
小于FUNDEPTPER.STARTDATE
时,我想要的列是INVOICE.INVAMT
(或NULL)的总和为的总和INVOICE.INVAMT
时INVOICE.INVDATE
是之间并且包括FUNDEPTPER.STARTDATE
和FUNDDEPTPER.STOPDATE
,(OR NULL)。 A grand total would be nice too. 总计也很不错。
I can do one at a time, but not both - my gut says this can be done - but I cannot figure out how. 我一次只能做一个,但不能两者都做-我的直觉说这可以做到-但我不知道怎么做。
Your help is greatly appreciated. 非常感谢您的帮助。 I do not need to know specifically (ie. the exact query language), if you could even explain high level I might be able to get it (if it is possible???)
我不需要专门了解(即确切的查询语言),如果您甚至可以解释高级知识,我也许可以得到(如果可能的话?)
My Query if you need it: 我的查询,如果您需要它:
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
You can do this with conditional aggregation 您可以通过条件聚合来做到这一点
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;
This query also introduces table aliases. 该查询还引入了表别名。 These make the query easier to write and to read.
这些使查询更易于编写和阅读。
I need to break down your needs to understand your inquiry. 我需要分解您的需求以了解您的询问。
You're requirement - two columns for the SUM (INVOICE.INVAMT): 您需要-SUM的两列(INVOICE.INVAMT):
sum of INVOICE.INVAMT (or NULL) when INVOICE.INVDATE is less than FUNDEPTPER.STARTDATE 当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;
sum of INVOICE.INVAMT when INVOICE.INVDATE is between and including FUNDEPTPER.STARTDATE and FUNDDEPTPER.STOPDATE 当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.