Oracle - select 用于转换和更改数据显示方式的语句
Oracle - select statement to pivot and change how data is displayed
我目前在 Oracle 表中有如下所示的数据:
Person_ID Fieldname Fieldnumber
123 2016 Salary 50000
123 2015 Salary 45000
123 2014 Salary 40000
123 2016 Vacation Days 5
456 2016 Salary 50000
456 2016 Vacation Days 5
789 2016 Salary 90000
789 2016 Vacation Days 5
我想为 Pivot 写一个 select 语句并更改数据的显示,使其看起来像这样:
Person_ID Fieldname 2016 2015 2014
123 Salary 55000 45000 40000
123 Vacation Days 5
456 Salary 50000
456 Vacation Days 5
789 Salary 90000
789 Salary 5
我该如何做到这一点,以便在添加新字段名称时,我的 SQL 会在我 运行 时自动添加新列?有没有办法用 pivot 做到这一点,还是我应该使用 union 或其他我不熟悉的函数?
我通常 运行 的枢轴看起来像这样,但我认为这个概念在这种情况下不起作用:
select *
from cust_matrix
unpivot
(
state_counts
for state_code in ("New York","Conn","New Jersey","Florida","Missouri")
)
order by "Puchase Frequency", state_code
谢谢
不要对有两列不属于 "pivot" 的事实感到困惑,在您的例子中是 person_id
和 fieldname
。旋转的工作方式完全相同。
注意 - 您的输入 table 显然缺少列名(年份)- 最好不要是 Year,这是 Oracle 中的保留字。我在示例输入中使用了 yr
。您在输出中也有错字(55000 来自哪里,2016 年和 person_id = 123?输入有 50000)。
并且,您可以将 2016 作为列名,但必须用双引号引起来,以后可能会出现意想不到的问题。最好使用标准的列名——特别是不能以数字开头。我用了y2016
等等
with
inputs ( person_id, yr, fieldname, fieldnumber ) as (
select 123, 2016, 'Salary' , 50000 from dual union all
select 123, 2015, 'Salary' , 45000 from dual union all
select 123, 2014, 'Salary' , 40000 from dual union all
select 123, 2016, 'Vacation Days', 5 from dual union all
select 456, 2016, 'Salary' , 50000 from dual union all
select 456, 2016, 'Vacation Days', 5 from dual union all
select 789, 2016, 'Salary' , 90000 from dual union all
select 789, 2016, 'Vacation Days', 5 from dual
)
-- end of test data; actual solution (SQL query) begins below this line
select person_id, fieldname, y2016, y2015, y2014
from inputs
pivot ( max(fieldnumber) for yr in (2016 as y2016, 2015 as y2015, 2014 as y2014) )
order by person_id, fieldname
;
PERSON_ID FIELDNAME Y2016 Y2015 Y2014
--------- ------------- ----- ----- -----
123 Salary 50000 45000 40000
123 Vacation Days 5
456 Salary 50000
456 Vacation Days 5
789 Salary 90000
789 Vacation Days 5
我目前在 Oracle 表中有如下所示的数据:
Person_ID Fieldname Fieldnumber
123 2016 Salary 50000
123 2015 Salary 45000
123 2014 Salary 40000
123 2016 Vacation Days 5
456 2016 Salary 50000
456 2016 Vacation Days 5
789 2016 Salary 90000
789 2016 Vacation Days 5
我想为 Pivot 写一个 select 语句并更改数据的显示,使其看起来像这样:
Person_ID Fieldname 2016 2015 2014
123 Salary 55000 45000 40000
123 Vacation Days 5
456 Salary 50000
456 Vacation Days 5
789 Salary 90000
789 Salary 5
我该如何做到这一点,以便在添加新字段名称时,我的 SQL 会在我 运行 时自动添加新列?有没有办法用 pivot 做到这一点,还是我应该使用 union 或其他我不熟悉的函数?
我通常 运行 的枢轴看起来像这样,但我认为这个概念在这种情况下不起作用:
select *
from cust_matrix
unpivot
(
state_counts
for state_code in ("New York","Conn","New Jersey","Florida","Missouri")
)
order by "Puchase Frequency", state_code
谢谢
不要对有两列不属于 "pivot" 的事实感到困惑,在您的例子中是 person_id
和 fieldname
。旋转的工作方式完全相同。
注意 - 您的输入 table 显然缺少列名(年份)- 最好不要是 Year,这是 Oracle 中的保留字。我在示例输入中使用了 yr
。您在输出中也有错字(55000 来自哪里,2016 年和 person_id = 123?输入有 50000)。
并且,您可以将 2016 作为列名,但必须用双引号引起来,以后可能会出现意想不到的问题。最好使用标准的列名——特别是不能以数字开头。我用了y2016
等等
with
inputs ( person_id, yr, fieldname, fieldnumber ) as (
select 123, 2016, 'Salary' , 50000 from dual union all
select 123, 2015, 'Salary' , 45000 from dual union all
select 123, 2014, 'Salary' , 40000 from dual union all
select 123, 2016, 'Vacation Days', 5 from dual union all
select 456, 2016, 'Salary' , 50000 from dual union all
select 456, 2016, 'Vacation Days', 5 from dual union all
select 789, 2016, 'Salary' , 90000 from dual union all
select 789, 2016, 'Vacation Days', 5 from dual
)
-- end of test data; actual solution (SQL query) begins below this line
select person_id, fieldname, y2016, y2015, y2014
from inputs
pivot ( max(fieldnumber) for yr in (2016 as y2016, 2015 as y2015, 2014 as y2014) )
order by person_id, fieldname
;
PERSON_ID FIELDNAME Y2016 Y2015 Y2014
--------- ------------- ----- ----- -----
123 Salary 50000 45000 40000
123 Vacation Days 5
456 Salary 50000
456 Vacation Days 5
789 Salary 90000
789 Vacation Days 5