【问题标题】:PL/SQL block query - Displaying total, Max, Min and AvgPL/SQL 块查询 - 显示总计、最大值、最小值和平均值
【发布时间】:2017-03-31 00:31:44
【问题描述】:

我是 PL/SQL 的新手,需要弄清楚以下问题。如果有人可以帮助我进行查询,我将不胜感激,以便我了解问题的构成。

我想创建一个新的匿名 PL/SQL 块,它将显示公司中的员工总数,他们的最高、最低和平均工资以及他们的平均工资四舍五入到整数。

这是正确的吗?

SELECT ROUND(MAX(salary),0) 'Maximum',  
ROUND(MIN(salary),0) 'Minimum',  
ROUND(SUM(salary),0) 'Sum',  
ROUND(AVG(salary),0) 'Average'  
FROM employees;  

PL/SQL 让我困惑

【问题讨论】:

  • 这看起来几乎是正确的。列名可以不加引号,也可以加双引号,例如“Sum”。最好不要使用 Sum 这样的保留关键字作为列名;最好使用 Max_salary、Min_salary、Total_salary 和 Average_salary 等列名。不需要round() 的第二个参数 0,因为 0 无论如何都是默认值;您可以简化为round(min(salary))(并且,如果所有薪水一开始都是整数,那么只有平均值需要四舍五入 - 其他人已经是整数了)。总的来说它看起来不错。这和 PL/SQL 有什么关系?
  • 不正确。您的查询中没有任何内容返回数字或员工。此外,如果您运行该代码,它可能会因为别名周围的单引号而引发错误。

标签: sql database oracle plsql oracle11g


【解决方案1】:

你有引号的问题:在列别名中,如果需要,你只能使用",或者简单地定义不带引号的别名;区别在于,例如:

SQL> SELECT count(employee_id) as "Number of employees", -- double quotes: this alias will keep the case of my string and have spaces
  2  ROUND(MAX(salary),0) "Maximum",
  3  ROUND(MIN(salary),0) "Minimum",
  4  ROUND(SUM(salary),0) Sum, -- no quotes: this will be in UPPERCASE and you can have no spaces
  5  ROUND(AVG(salary),0) Average
  6  FROM employees;

Number of employees    Maximum    Minimum        SUM    AVERAGE
------------------- ---------- ---------- ---------- ----------
                107      24000       2100     691416       6462

此外,准确地说,这是一个 SQL 查询,而下面是一个 PL/SQL 块:

declare
    vCount number;
    vMax number;
    vMin number;
    vSum number;
    vAvg number;
begin  
    SELECT count(employee_id) as "Number of employees", 
    ROUND(MAX(salary),0) "Maximum",
    ROUND(MIN(salary),0) "Minimum",
    ROUND(SUM(salary),0) Sum, 
    ROUND(AVG(salary),0) -- you need no aliases here
    into vCount,
         vMax,
         vMin,
         vSum,
         vAvg
    FROM employees;
    --
    dbms_output.put_line('Count: ' || vCount || ' - ' || 
                            'Max: ' || vMax || ' - ' ||
                            'Min: ' || vMin || ' - ' ||
                            'Sum: ' || vSum || ' - ' ||
                            'Avg: ' || vAvg);
end;

【讨论】:

    【解决方案2】:

    这个问题不是 100% 明确的,但是您说您需要按公司进行,并且您还需要每个公司的员工人数?我猜你的表包含一个像 nCompanyID 这样的字段?

    然后你会有:

    SELECT
        nCompanyID as Company -- I don't know if you have an ID or a string for it...
        COUNT(*) as nbEmployees,
        ROUND(MAX(salary),0) as MaximumSalary,
        ROUND(MIN(salary),0) as MinimumSalary,
        ROUND(SUM(salary),0) as TotalSalary,
        ROUND(AVG(salary),0) as AverageSalary
    FROM employees
    GROUP BY nCompanyID;
    

    请注意,这是在 MS SQL Server 中,但我确信 oracle 的 SQL 对于此类事情具有几乎相同的语法。

    【讨论】:

    • 如果您阅读原始问题上的 cmets,您会发现您传播了一个主要问题:列别名需要用双引号括起来。
    • 除非这是错误的。单引号工作得很好......当你不知道你在说什么时,你能不能不要给别人投票?我正在努力提高我在这里的声誉......
    • 我直接从甲骨文网站上的一个帖子中获得了这个建议。另外,假设线程是错误的。我明确指出这是针对 MS SQL Server 的,它可能需要针对 Oracle 进行一些调整。我仍然是唯一一个真正试图通过告诉他如何添加 nbEmployees 和公司组来提供帮助的人......
    • 很抱歉您误解了您正在阅读的主题,但这绝对行不通。在我看来,发布不正确的答案值得投反对票,尤其是在 cmets 中已经给出了真正答案的情况下。
    • 我是如何误解了这个主题的?我首先回复了所有内容,但我没有更正引号,因为 ORACLE 板上的一个帖子证实我单引号有效!如果那个线程是错误的,那很好。但是一个简单的编辑就可以解决一切。另一个人的答案要复杂 10 倍,完全没有。无论如何,你知道吗?我不会再试图帮助了。拧那个。我想帮忙,但从现在开始,我不再在乎其他人了。我会继续使用堆栈来获取答案,但如果它最终让我付出代价,我不会帮助人们......
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2022-10-26
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多