我们的会计部门需要每月从我们的MIS中提取税务数据,并将其在线提交给税务部。不幸的是,在提取数据时,数据会重复不同的次数,这取决于我们必须向哪个司法管辖区纳税。她只需要一个司法管辖区、一行的美元金额,因为她在网站上输入了这一金额。
我曾尝试使用DISTINCT只提取该类型的一条记录,并结合LEFT((只提取管辖区的前7个字符,但最终排除了本应包括的某些结果。我相信这是因为几笔交易的过账日期和金额完全相同。它们是单独的事务,但查询将它们视为重复事务并忽略它们。
以下是我运行的几个查询示例,它们成功地提取了大部分数据,但大多数时候要么太多,要么不够:
SELECT DISTINCT LEFT("Sales-Tax-Jurisdiction-Code", 7), "Taxable-Base", "Posting-Date"
FROM ARInvoiceTax
WHERE ("Posting-Date" >= '2019-09-01' AND "Posting-Date" <= '2019-09-30')
AND (("Sales-Tax-Jurisdiction-Code" BETWEEN '55001' AND '56763')
OR "Sales-Tax-Jurisdiction-Code" = 'Dakota Cty TT')
ORDER BY "Sales-Tax-Jurisdiction-Code"
下面是一个我可以提取所有数据的查询,随后的结果如下:
SELECT "Sales-Tax-Jurisdiction-Code", "Taxable-Base", "Posting-Date"
FROM ARInvoiceTax
WHERE ("Posting-Date" >= '2019-09-01' AND "Posting-Date" <= '2019-09-30')
AND (("Sales-Tax-Jurisdiction-Code" BETWEEN '55001' AND '56763')
OR "Sales-Tax-Jurisdiction-Code" = 'Dakota Cty TT')
ORDER BY "Sales-Tax-Jurisdiction-Code"
以下是输出示例:
Jurisdiction | Tax Amount | Posting Date
-------------|------------|-------------
5512100City | $50.00 | 2019-09-02
5512100City | $50.00 | 2019-09-03
5512100City | $70.00 | 2019-09-02
5512100Cnty | $50.00 | 2019-09-02
5512100Cnty | $50.00 | 2019-09-03
5512100Cnty | $70.00 | 2019-09-02
5512100State | $70.00 | 2019-09-02
5512100State | $50.00 | 2019-09-02
5512100State | $50.00 | 2019-09-03
5513100Cnty | $25.00 | 2019-09-12
5513100State | $25.00 | 2019-09-12
5514100City | $9.00 | 2019-09-06
5514100City | $9.00 | 2019-09-06
5514100Cnty | $9.00 | 2019-09-06
5514100Cnty | $9.00 | 2019-09-06
5515100State | $12.00 | 2019-09-11
5516100City | $6.00 | 2019-09-13
5516100City | $7.00 | 2019-09-13
5516100State | $6.00 | 2019-09-13
5516100State | $7.00 | 2019-09-13
正如您所看到的,数据可以遍布各地。一个邮政编码可能有多条不同的线路。会计部门现在所做的是打印一份包含这些信息的报告,并在电子表格中只记录每笔交易的(1(美元金额。例如,对于55121,她需要记录50.00美元、50.00美元和70.00美元(她对它们进行了统计,并在网站上添加了总额(,但SQL查询给了我这(3(个数字,(3(次。
我似乎想不出一个只提取一组数据的查询。不幸的是,我不能根据00后的单词/字母来做这件事,因为并不是所有的司法管辖区都有全部3个(城市、州(,因此试图删除基于这一点的行也会删除有效行。
你能使用select distinct
吗?如果前五个字符是邮政编码,而你只想要:
select distinct left(jurisdiction, 5), tax_amount
from t;
仅取市/县/。。第一个是什么
select jurisdiction, tax_amount, Posting_Date
from (
select *, dense_rank() over(partition by left(jurisdiction, 7) order by substring(jurisdiction, 8, len(jurisdiction))) rnk
from taxes -- you output here
)
where rnk=1;
Sql服务器语法,您可能需要在dbms中使用其他字符串函数。
Postgresql fiddle