【问题标题】:iterate over select statement, return data in rows & custom total row [closed]遍历 select 语句,按行返回数据和自定义总行 [关闭]
【发布时间】:2021-02-14 01:55:18
【问题描述】:

我想像这样返回一个特定的表。

+-------------+------+-------+--------------+
|  full_name  | mark | grade | good_student |
+-------------+------+-------+--------------+
| mike smith  |   42 | F     | N            |
| sam logan   |   90 | A     | Y            |
| TOTAL MARKS |  132 | NULL  | NULL         |
+-------------+------+-------+--------------+

谁能告诉我如何为每一行的每一列设置特定数据。例如,good_student 是我使用逻辑设置的自定义数据,如果标记大于 50,则为Y,否则为N。 以及在末尾返回一个自定义行,其中包含TOTAL MARKS,这是标记的总和。

我正在尝试了解如何编写自己的 if 语句并返回自定义设置的数据行,但我迷路了。 请不要更改我在 PLPGSQL 函数中提供的 SQL 选择语句。我故意这样做是为了更好地理解 PLPGSQL 部分。

CREATE TABLE students (
  id integer primary key,
  first_name text,
  last_name text,
  mark integer,
  grade text
);

INSERT INTO students (id, first_name, last_name, mark, grade) VALUES
(1, 'mike', 'smith', 42, 'F'),
(2, 'sam', 'logan', 90, 'A');

CREATE TYPE ClassRecord as (
  full_name text,
  mark integer,
  grade text,
  good_student char(1) -- Y if mark above 50, N if mark below 50
);

CREATE OR REPLACE FUNCTION
   generateClassRecord()
   RETURNS ClassRecord
AS $$

BEGIN
    FOR ROW IN SELECT * FROM students;
    -- Unsure how to access things now and return specific data
END

$$ language plpgsql

【问题讨论】:

    标签: sql database postgresql plpgsql


    【解决方案1】:

    case 表达式返回最后一列和union all 最后一行:

    select s.*
    from ((select s.full_name, s.mark, s.grade,
                  (case when s.grade > 50 then 'Y' else 'N') as good_student
           from students s
          ) union all
          (select 'TOTAL MARKS', sum(s.mark), null, null
           from students
          )
         ) s
    order by (full_name = 'TOTAL MARKS')::int desc;
    

    【讨论】:

    • 能否在不更改我的select * from students 声明的情况下向我展示?我知道如何通过 select 语句来做到这一点,但我正在努力学习 PLPGSQL。我的问题是基于 PLPGSQL
    • 为什么会被否决?
    • 我不知道,但我赞成并把它作为答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多