现在需要编写一个查询,逻辑如下:
Same client Id(duplicate client_id), same Tax_year, same Tax_effective_date but with different tax_code and Payroll_id.
其他列的数据应按原样显示。
预期输出:
我尝试使用 CTE 表编写查询,但无法获得正确的结果。有人可以帮我写这个查询吗?
您可以将表与其自身连接起来以查找匹配对,然后
UNPIVOT
将匹配的值分成两行:
SELECT client_id,
tax_year,
tax_effective_date,
tax_code,
payroll_id,
gross_paid,
tax_paid
FROM (
SELECT t1.client_id,
t1.tax_year,
t1.tax_effective_date,
t1.tax_code AS tax_code1,
t2.tax_code AS tax_code2,
t1.payroll_id AS payroll_id1,
t2.payroll_id AS payroll_id2,
t1.gross_paid AS gross_paid1,
t2.gross_paid AS gross_paid2,
t1.tax_paid AS tax_paid1,
t2.tax_paid AS tax_paid2
FROM table_name t1
INNER JOIN table_name t2
ON ( t1.client_id = t2.client_id
AND t1.tax_year = t2.tax_year
AND t1.tax_effective_date = t2.tax_effective_date
AND t1.tax_code < t2.tax_code
AND t1.payroll_id != t2.payroll_id )
)
UNPIVOT (
(tax_code, payroll_id, gross_paid, tax_paid)
FOR match IN (
(tax_code1, payroll_id1, gross_paid1, tax_paid1) AS 1,
(tax_code2, payroll_id2, gross_paid2, tax_paid2) AS 2
)
)
对于样本数据:
CREATE TABLE table_name(
client_id,
tax_year,
tax_effective_date,
tax_code,
payroll_id,
gross_paid,
tax_paid
) AS
SELECT 1, 2020, DATE '2024-01-01', 'AAA', 111, 100, 20 FROM DUAL UNION ALL
SELECT 1, 2020, DATE '2024-01-01', 'AAA', 222, 100, 20 FROM DUAL UNION ALL
SELECT 1, 2020, DATE '2024-01-02', 'BBB', 333, 100, 20 FROM DUAL UNION ALL
SELECT 1, 2020, DATE '2024-01-02', 'CCC', 444, 200, 40 FROM DUAL UNION ALL
SELECT 2, 2020, DATE '2024-01-01', 'AAA', 111, 100, 20 FROM DUAL UNION ALL
SELECT 2, 2020, DATE '2024-01-01', 'BBB', 111, 100, 20 FROM DUAL UNION ALL
SELECT 3, 2020, DATE '2024-01-01', 'AAA', 111, 100, 20 FROM DUAL UNION ALL
SELECT 3, 2020, DATE '2024-01-01', 'BBB', 222, 200, 30 FROM DUAL;
输出:
CLIENT_ID | TAX_YEAR | TAX_EFFECTIVE_DATE | 税号 | PAYROLL_ID | GROSS_PAID | 已付税费 |
---|---|---|---|---|---|---|
1 | 2020 | 2024-01-02 00:00:00 | BBB | 333 | 100 | 20 |
1 | 2020 | 2024-01-02 00:00:00 | CCC | 444 | 200 | 40 |
3 | 2020 | 2024-01-01 00:00:00 | AAA | 111 | 100 | 20 |
3 | 2020 | 2024-01-01 00:00:00 | BBB | 222 | 200 | 30 |