在 ORACLE SQL 中使用相同的客户端 ID、相同的 Tax_year、相同的 Tax_ effective_date 但具有不同的 Tax_id 和 Payroll_ID 编写 SQL 查询

问题描述 投票:0回答:1

我有一个如下数据的表格: enter image description here

现在需要编写一个查询,逻辑如下:

Same client Id(duplicate client_id), same Tax_year, same Tax_effective_date but with different tax_code and Payroll_id.
其他列的数据应按原样显示。

预期输出:

enter image description here

我尝试使用 CTE 表编写查询,但无法获得正确的结果。有人可以帮我写这个查询吗?

sql oracle
1个回答
0
投票

您可以将表与其自身连接起来以查找匹配对,然后

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.