如何在SQL查询中将行转换为列



如何在SQL查询中将行转换为列,下面是我的查询。

SELECT  sum(result_value), element_name
FROM pay_assignment_actions paa,pay_payroll_actions ppa,per_time_periods ptp,pay_run_results prr,
pay_element_types_f ele,pay_run_result_values rrv,pay_input_values_f piv,pay_element_classifications pec
WHERE pec.classification_id = ele.classification_id AND paa.payroll_action_id = ppa.payroll_action_id
AND ppa.time_period_id = ptp.time_period_id AND paa.assignment_action_id = prr.assignment_action_id
AND prr.element_type_id = ele.element_type_id AND prr.run_result_id = rrv.run_result_id
AND rrv.input_value_id = piv.input_value_id AND piv.name = 'Pay Value'
-- AND paa.assignment_id = paaf.assignment_id 
--AND :period_name BETWEEN TRUNC(ptp.start_date) and TRUNC(ptp.end_date)
AND element_name in ('AH Basic Salary','AH Housing Allowance','AH Transport Allowance')
GROUP BY element_name

输出现在我得到:

salary                     element_name
------------               --------------------
682236308.24    AH Housing Allowance
3277904755.58   AH Basic Salary
346652883.22    AH Transport Allowance

,但我想要的结果如下:


AH Housing Allowance   AH Basic Salary   AH Transport Allowance
--------------------   ----------------  ----------------------
682236308.24            3277904755.58     346652883.22

可能有助于在查询后进行PIVOT(请消除GROUP BY和SUM):

PIVOT 
(
SUM(result_value) for element_name in('AH Basic Salary','AH Housing Allowance','AH Transport Allowance')
);

https://www.oracle.com/technical-resources/articles/database/sql-11g-pivot.html

SELECT * FROM (    
SELECT result_value, element_name 
FROM pay_assignment_actions paa,pay_payroll_actions ppa,per_time_periods ptp,pay_run_results prr, pay_element_types_f ele,pay_run_result_values rrv,pay_input_values_f piv,pay_element_classifications pec 
WHERE pec.classification_id = ele.classification_id 
AND paa.payroll_action_id = ppa.payroll_action_id 
AND ppa.time_period_id = ptp.time_period_id 
AND paa.assignment_action_id = prr.assignment_action_id 
AND prr.element_type_id = ele.element_type_id 
AND prr.run_result_id = rrv.run_result_id 
AND rrv.input_value_id = piv.input_value_id 
AND piv.name = 'Pay Value' 
-- AND paa.assignment_id = paaf.assignment_id --AND :period_name BETWEEN TRUNC(ptp.start_date) and TRUNC(ptp.end_date) 
AND element_name in ('AH Basic Salary','AH Housing Allowance','AH Transport Allowance')
)
PIVOT 
(
SUM(result_value) for element_name in('AH Basic Salary','AH Housing Allowance','AH Transport Allowance')
);

但是我不能在没有Create语句的情况下测试它。

在Oracle 11之前,这可能是解决方案:

SELECT 
sum(case when element_name = 'AH Basic Salary' then result_value end) as AH Basic Salary,
sum(case when element_name = 'AH Housing Allowance' then result_value end) as AH Housing Allowance,
sum(case when element_name = 'AH Transport Allowance' then result_value end) as AH Transport Allowance
FROM pay_assignment_actions paa,pay_payroll_actions ppa,per_time_periods ptp,
pay_run_results prr, pay_element_types_f ele,pay_run_result_values rrv,
pay_input_values_f piv,pay_element_classifications pec 
WHERE pec.classification_id = ele.classification_id 
AND paa.payroll_action_id = ppa.payroll_action_id 
AND ppa.time_period_id = ptp.time_period_id 
AND paa.assignment_action_id = prr.assignment_action_id 
AND prr.element_type_id = ele.element_type_id 
AND prr.run_result_id = rrv.run_result_id 
AND rrv.input_value_id = piv.input_value_id 
AND piv.name = 'Pay Value' 
-- AND paa.assignment_id = paaf.assignment_id --AND :period_name BETWEEN TRUNC(ptp.start_date) and TRUNC(ptp.end_date) 
AND element_name in ('AH Basic Salary','AH Housing Allowance','AH Transport Allowance')

使用pivot代替groupby,同时在select语句中使用新的列名

SELECT  [AH Basic Salary],[AH Housing Allowance],[AH Transport Allowance]
FROM pay_assignment_actions paa,pay_payroll_actions ppa,per_time_periods ptp,pay_run_results prr,
pay_element_types_f ele,pay_run_result_values rrv,pay_input_values_f piv,pay_element_classifications pec
WHERE pec.classification_id = ele.classification_id AND paa.payroll_action_id = ppa.payroll_action_id
AND ppa.time_period_id = ptp.time_period_id AND paa.assignment_action_id = prr.assignment_action_id
AND prr.element_type_id = ele.element_type_id AND prr.run_result_id = rrv.run_result_id
AND rrv.input_value_id = piv.input_value_id AND piv.name = 'Pay Value'
-- AND paa.assignment_id = paaf.assignment_id 
--AND :period_name BETWEEN TRUNC(ptp.start_date) and TRUNC(ptp.end_date)
AND element_name in ('AH Basic Salary','AH Housing Allowance','AH Transport Allowance')
PIVOT 
(
SUM(result_value) FOR element_name IN ([AH Basic Salary],[AH Housing Allowance],[AH Transport Allowance])
)
AS PivotTable;

最新更新