【问题标题】:how to convert row as column in sql query如何在sql查询中将行转换为列
【发布时间】:2021-11-09 08:40:38
【问题描述】:

如何在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

【问题讨论】:

  • 在 Oracle 中使用 PIVOT 函数 - 完全符合您的要求。你可以在这里阅读:blogs.oracle.com/sql/post/…
  • 今日提示:切换到现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),并且在需要时更容易转换为外连接。

标签: sql plsql oracle-sqldeveloper plsqldeveloper plsql-package


【解决方案1】:

使用 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;

【讨论】:

    【解决方案2】:

    在查询后可能有助于 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')
    

    【讨论】:

    • 是的,我正在尝试相同的方法,但出现与 ORA-00933 相同的错误:SQL 命令未正确结束 00933。00000 -“SQL 命令未正确结束” *原因:*操作:行错误:13 列: 1
    • 那是哪一行?枢?你的 oracle 版本号是多少?
    • s,出现错误(PIVOT 的下一行
    • 你的oracle版本号是多少?
    • Oracle 数据库 10g 企业版 10.2.0.4.0 - 64bi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多