SQL Запрос на изменение формата столбца на строку для каждого значения - PullRequest
0 голосов
/ 03 августа 2020

У меня есть запрос, который извлекает данные вроде -

# 1

select 
       assignment_number, 
       ldg_name, 
       effective_start_date, 
       tax_reporting_name, 
       payroll_relationship_number, 
       filing_status, 
       allowance, 
       additional_tax_extra_withold, 
       exemp_fit, 
       exemp_medicare, 
       exemp_wage_accumulation, 
       exemp_unemployment
       
       from
       
       ( SELECT PPRD.payroll_relationship_number, 
               PAAM.assignment_number, 
               PLDG.name 
               LDG_NAME, 
               To_char(PAAM.effective_start_date, 'YYYY-MM-DD') 
                      effective_start_date, 
               (SELECT DISTINCT HOU.name 
                FROM   pay_dir_rep_cards_f PDRCF, 
                       hr_organization_units HOU, 
                       pay_dir_rep_card_usages_f PDRCUF, 
                       pay_rel_groups_dn PRGD1 
                WHERE  PDRCF.dir_card_id = PDCF.dir_card_id 
                       AND HOU.organization_id = PDRCF.tax_unit_id 
                       AND PDRCUF.dir_rep_card_id = PDRCF.dir_rep_card_id 
                       AND PRGD1.relationship_group_id = 
                           PDRCUF.relationship_group_id 
                       AND PDRCF.dir_card_comp_id = PDCCF2.dir_card_comp_id 
                       AND trunc(sysdate) -11 BETWEEN PDRCF.effective_start_date AND 
                                                  PDRCF.effective_end_date 
                       AND trunc(sysdate) -11 BETWEEN 
                           PRGD1.start_date AND PRGD1.end_date) 
                      TAX_REPORTING_NAME, 
               (SELECT DISTINCT Decode (dir_information_char1, '1', 'Single', 
                                                               '2', 'Married', 
                                                               '3', 
                                'Married and withholding at higher single rate'
                                           
                FROM   pay_dir_card_components_f PDCCF3, 
                       pay_dir_comp_details_f PDCDF3 
                WHERE  PDCCF3.dir_card_id = PDCF.dir_card_id 
                       AND PDCCF3.dir_card_comp_id = PDCDF3.dir_card_comp_id 
                       AND PDCDF3.dir_information_category = 
                           'HRX_US_WTH_FEDERAL_INCOME_TAX' 
                       AND trunc(sysdate) -11 BETWEEN PDCDF3.effective_start_date 
                                                  AND 
                                                  PDCDF3.effective_end_date) 
                      FILING_STATUS, 
                      exemp_fit, 
       PDFC.exemp_medicare, 
       PDFC.exemp_wage_accumulation, 
       PDFC.exemp_unemployment, 
       PDFC.exemp_social_security, 
       PDFC.regular_rate, 
       PDFC.regular_amount, 
       PDFC.supplemental_rate, 
       PDFC.supplemental_amt, 
       PDFC.irs_lock_in_date, 
       PDFC.statutory_employee, 
       PDFC.cumulative_taxation, 
       PDFC.primary_address, 
       PDFC.state_disability_calc, 
       PDFC.state_unemp_calc, 
       PDFC.qualifying_dependent, 
       PDFC.other_dependent, 
       PDFC.total_dependent, 
       PDFC.other_income, 
       PDFC.deduction_amount, 
       PDFC.max_federal_allowance ,
       PDFC.allowance, 
       PDFC.additional_tax_extra_withold
       from 
       per_all_assignments_m paam,
       per_all_payroll_relationship PPRD,
       per_legislative_table PLDG,
       Per_cards PDCF,
       Per_components PDFC
       WHERE PAAM.ASSIGNMENT_NUMBER = PPRD.ASSIGNMENT_NUMBER
       AND PPRD.LEGAL_UNIT = PLDG.LEGAL_UNIT
       AND PDCF.dir_card_id = PDFC.dir_card_id
       AND PDFC.ASSIGNMENT_ID = PAAM.ASSIGNMENT_ID
       AND trunc(sysdate) -11 BETWEEN PAAM.effective_start_date 
                                                  AND 
                                                  PAAM.effective_end_date)
                                                  

Приведенный выше запрос дает мне правильный результат в формате -

 assignment_number  ldg_name effective_start_date tax_reporting_name payroll_relationship_number filing_status  allowance additional_tax_extra_withold  exemp_fit  exemp_medicare  exemp_wage_accumulation  exemp_unemployment      
10                  US          02-Aug-2020         Ontario                 10-1                    Single       1000       10                          Y           N

Мне нужны эти столбцы в формате (Столбцы в строки) -

ASSIGNMENT_NUMBER       ValueDefinitionName
10                      filing_status       
10                      allowance
10                      additional_tax_extra_withold
10                      exemp_fit
10                      exemp_medicare

, т.е. имена столбцов, которые никогда не являются нулевыми для assignment_number.

Кроме того, в формате,

ASSIGNMENT_NUMBER       ValueDefinitionName                             Value1
10                      filing_status                                   Single
10                      allowance                                       1000
10                      additional_tax_extra_withold                    10      
10                      exemp_fit                                       Y
10                      exemp_medicare                                  N   

Так как exemp_wage_accumulation и exemp_unemployment имеют значение null, его не следует включать.

Есть ли какой-либо способ достичь, используя мой первый запрос №1?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы должны иметь возможность использовать unpivot для этого ...

Вот способ сделать это. Я заменил большой запрос, который вы получили как временный блок, на соответствующие типы данных -> данные. Вам нужно будет заменить запрос, который у меня есть в блоке "data", на большой запрос, который вы получили, а также убедиться, что типы данных для всех столбцов, которые вы получили, согласованы (в этом случае все столбцы, отличные от varchar, являются тип приведен к varchar)

После этого вы можете использовать unpivot следующим образом:

with data
  as (select  assignment_number
             ,ldg_name                    
             ,to_char(effective_start_date,'dd-mon-yyyy') as effective_start_date
             ,tax_reporting_name          
             ,payroll_relationship_number 
             ,filing_status               
             ,to_char(allowance)  as allowance
             ,to_char(additional_tax_extra_withold) as additional_tax_extra_withold
             ,exemp_fit                   
             ,exemp_medicare              
             ,exemp_wage_accumulation     
             ,exemp_unemployment 
      from t 
      ) 
select *
 from data
unpivot (value1 for valuedefinitions in (
                      ldg_name                    
                      ,effective_start_date
                      ,tax_reporting_name          
                      ,payroll_relationship_number 
                      ,filing_status               
                      ,allowance 
                      ,additional_tax_extra_withold
                      ,exemp_fit                   
                      ,exemp_medicare              
                      ,exemp_wage_accumulation     
                      ,exemp_unemployment          
                   ) 
        )


+-------------------+------------------------------+-------------+
| ASSIGNMENT_NUMBER |       VALUEDEFINITIONS       |   VALUE1    |
+-------------------+------------------------------+-------------+
|                10 | LDG_NAME                     | US          |
|                10 | EFFECTIVE_START_DATE         | 02-aug-2020 |
|                10 | TAX_REPORTING_NAME           | Ontario     |
|                10 | PAYROLL_RELATIONSHIP_NUMBER  | 10-1        |
|                10 | FILING_STATUS                | Single      |
|                10 | ALLOWANCE                    | 1000        |
|                10 | ADDITIONAL_TAX_EXTRA_WITHOLD | 10          |
|                10 | EXEMP_FIT                    | Y           |
|                10 | EXEMP_MEDICARE               | N           |
+-------------------+------------------------------+-------------+

Вот ссылка на скрипт db

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=9d211abbede82e276464333018a70731

0 голосов
/ 03 августа 2020

Вы можете попробовать метод ниже, но он будет работать только в том случае, если все столбцы, кроме номера назначения, имеют один и тот же тип, то есть varchar или integer. Вы можете иметь свой основной запрос как CTE.

Примечание. Это не полный рабочий запрос, а просто подсказка для начала работы.

with table1 as (...You existing query...)
SELECT ASSIGNMENT_NUMBER, "FILING_STATUS" AS VALUEDefinationname, filing_status as value1 from table1 where filing_status is not null
union
SELECT ASSIGNMENT_NUMBER, "allowance", allowance from table1 where allowance is not null
...