【问题标题】:Oracle Sql Syntax (2)Oracle Sql 语法(二)
【发布时间】:2019-01-15 01:43:20
【问题描述】:

  1. 我想将任务的值设置为支持、项目、开发、行政职责和午餐。有什么办法可以将其设置为默认值 这样我就不必改变它了。如果我在其中插入另一行 会完全不同。

关于第 2 点,已解决。 正确的语法是 -

 UPDATE it_time_track SET Monday = (SELECT SUM(Monday) FROM it_time_track ) WHERE id = 7*
  1. 如您所知,这只是一种让我只在视觉上想要的桌子的方法,但我无法让它像我想要的那样运作。

我希望每日总计是列值的总和。这是我的尝试:

select sum(Monday) 
from it_time_track 
into 
Monday where id = 7 ;

尝试 2:

Select sum(Monday) from it_time_track into Monday 
where PERCENTAGE like 
'Daily total' from it_time_track ;

【问题讨论】:

  • 如果你想对按天分组的记录求和,那么你应该使用 GROUP BY。
  • 图片和屏幕截图可以很好地添加到帖子中,但请确保帖子在没有它们的情况下仍然清晰且有用。 不要发布代码或错误消息的图像。而是直接复制并粘贴或键入实际代码/消息。
  • 关于第 1 点:如果我理解正确,您希望您的 TASK 列在插入期间具有默认值“支持、项目、开发、管理职责和午餐”,如果没有另外选择?关于第 2 点:您是否要从图片中选择要显示的数据(此外,在 MONDAY 列中有 dana 是您想要的总和),或者您是否已经在表格中有这样的数据并且您只是想要使用汇总数据更新该表?
  • into 子句位于查询投影之后,before from 子句。
  • @GoranKutlaca 你理解我关于第 1 点的问题。如果没有另外选择,我希望我的任务列在插入期间具有默认值“支持、项目、开发、管理职责和午餐”。

标签: sql oracle oracle11g oracle-apex


【解决方案1】:

您想要的表看起来应该是查询的输出,而不是表本身。看看这个...

create table base_table (
    task varchar2(255) not null,
    day_of_week varchar2(255),
    hours number);

insert into base_table values ('Support', 'MONDAY', 10);
insert into base_table values ('Support', 'MONDAY', 7);
insert into base_table values ('Support', 'MONDAY', 5);
insert into base_table values ('Support', 'MONDAY', 1);
insert into base_table values ('UnScheduled Project', 'MONDAY', 1);
insert into base_table values ('Admin', 'MONDAY', 12);
insert into base_table values ('Out of Office', 'MONDAY', 8);
insert into base_table values ('~NULL~', 'MONDAY', 3);
insert into base_table values ('Support', 'TUESDAY', 5);
insert into base_table values ('Support', 'TUESDAY', 1);

select nvl(task, 'Total') as task,
    round(total_hours / first_value(total_hours) over (order by sort_order desc) * 100, 2) as pct_of_total,
    total_hours, monday, tuesday, wednesday, thursday, friday
from (select task, rank() over (order by task) as sort_order,
        sum(hours) as total_hours,
        sum(case when day_of_week = 'MONDAY' then hours else null end) as monday,
        sum(case when day_of_week = 'TUESDAY' then hours else null end) as tuesday,
        sum(case when day_of_week = 'WEDNESDAY' then hours else null end) as wednesday,
        sum(case when day_of_week = 'THURSDAY' then hours else null end) as thursday,
        sum(case when day_of_week = 'FRIDAY' then hours else null end) as friday
    from base_table
    group by grouping sets ((task), ()))
order by sort_order;

在此处输出:SQLFiddle

内部查询使用分组集来获取总计行。然后外部查询使用分析函数来获取总行,以便计算总的 pct。我在这里做了整整一周,但如果需要,您可以将其复制到每一天的列中。

【讨论】:

  • 感谢您的辛勤工作。我看到了结果。输出很好,接近我想要的,但我不明白你是怎么做到的。
  • 我理解案例陈述,但后来我迷路了。
  • 什么是 first_value ?
  • 这是最有帮助的答案。
  • first_value 是一个解析函数。您可以将其视为在结果上运行的函数。当结果以指定的方式排序时,first_value 为我提供了指定列的第一个值。这就是为什么我在内部查询中添加了 sort_order 列,这样我就可以轻松地在外部查询中拉出总行。
【解决方案2】:

第 1 点:

您可以在创建表时设置默认值,但您现在也可以设置它,使用:

 ALTER TABLE it_time_track
    MODIFY (task DEFAULT 'Support, Project, Development ,Administrative duties and Lunch');

如果没有给出其他字符串,那将在插入期间将该列的值设置为该字符串。

对于第 2 点,您已经找到了答案 :)

【讨论】:

  • 我想要 5 行,每行有一个值,而不是整个字符串,这也表示更改命令无效。
  • [代码:940,SQL 状态:42000] ORA-00940:ALTER 命令无效
  • @Naq_23 我不再明白你想做什么......你不能在一个列上设置多个默认值......你打算在什么情况下插入你的表?跨度>
  • 我希望能够做到这一点。这就是我发布问题的原因。当我创建一个表时,我定义了列,有没有办法让我定义行。所以如果 x 是行,y 是列,那么我有没有办法在点 x,y 处定义一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多