【问题标题】:Making a Pivot in oracle SQL [duplicate]在 oracle SQL 中进行 Pivot [重复]
【发布时间】:2021-10-20 13:07:20
【问题描述】:

我在 oracle sql 中进行数据透视时遇到了一些麻烦。我有一张桌子,上面有workdateemployee 和他们的shift 一天。此表称为SHIFT。 我希望在这个数据透视中,工作日期成为列标题,员工成为行标题,轮班成为一天,这样您就可以看到员工每天的轮班。

我目前的问题是我有一个查询,但枢轴要求我放置一个聚合函数。查询如下:

select employee, workdate, shift from shift
pivot (
        max(shift)
        for employee
        in (
            1,2,3,4
        )
)

所以我这样做了,它带回了所有列,而不是以旋转格式。 当前结构:

employee workdate shift
employee1 date1 shift1
employee1 date2 shift2
employee2 date1 shift1
employee2 date2 shift2
employee3 date1 shift1
employee3 date2 shift2
employee4 date1 shift1
employee4 date2 shift2
employee5 date1 shift1
employee5 date2 shift2

我想要的结果是:

date1 date2 date3
employee1 shift1 shift2 shift3
employee2 shift1 shift2 shift3
employee3 shift1 shift2 shift3
employee4 shift1 shift2 shift3

感谢您的回答。

【问题讨论】:

  • 如果需要按日期进行透视,则需要在for 中指定workdate,在in 中指定日期
  • 我希望 workdae 跑过,员工跑下来,但班次必须在数据之间(每天班次),但我必须在枢轴中使用聚合函数,它只会产生错误的结果

标签: sql oracle pivot


【解决方案1】:

如果您需要员工的 where 子句以及工作日期的支点,那么您将编写

 SELECT * FROM (
    SELECT employee, workdate, shift 
        FROM shift WHERE employee IN ('employee1', 'employee2', 'employee3')
   )
   pivot (
       max(shift)
       for workdate
       in (
        ('date1','date2','date3','date4')
      )
  )

【讨论】:

  • 这行得通。谢谢你。这是另一种查询方式
【解决方案2】:

你想要:

select employee,
       date1,
       date2,
       date3
from   shift
pivot (
 max(shift)
 for workdate
 in (
   DATE '2021-08-17' AS date1,
   DATE '2021-08-18' AS date2,
   DATE '2021-08-19' AS date3
 )
)

其中,对于您的示例数据:

CREATE TABLE shift (employee, workdate, shift) AS
SELECT 'employee1', DATE '2021-08-17', 'shift1' FROM DUAL UNION ALL
SELECT 'employee1', DATE '2021-08-18', 'shift2' FROM DUAL UNION ALL
SELECT 'employee2', DATE '2021-08-17', 'shift1' FROM DUAL UNION ALL
SELECT 'employee2', DATE '2021-08-18', 'shift2' FROM DUAL UNION ALL
SELECT 'employee3', DATE '2021-08-17', 'shift1' FROM DUAL UNION ALL
SELECT 'employee3', DATE '2021-08-18', 'shift2' FROM DUAL UNION ALL
SELECT 'employee4', DATE '2021-08-17', 'shift1' FROM DUAL UNION ALL
SELECT 'employee4', DATE '2021-08-18', 'shift2' FROM DUAL UNION ALL
SELECT 'employee5', DATE '2021-08-17', 'shift1' FROM DUAL UNION ALL
SELECT 'employee5', DATE '2021-08-18', 'shift2' FROM DUAL;

输出:

EMPLOYEE DATE1 DATE2 DATE3
employee2 shift1 shift2
employee1 shift1 shift2
employee3 shift1 shift2
employee5 shift1 shift2
employee4 shift1 shift2

注意:您的数据中 shift3 的行数为零。

db小提琴here

【讨论】:

  • 这行得通,但我还发现您可以在交互式报告中执行相同的透视,并将 LOV 添加到班次列,它按我希望的方式工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2020-06-30
  • 2019-09-03
  • 1970-01-01
相关资源
最近更新 更多