进度查询,根据重复项的数量删除重复项



我们的会计部门需要每月从我们的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

最新更新