添加一列,其值取决于另一行的值

问题描述 投票:0回答:1

我正在尝试在表中实现“自动失败”类型的列,其中包含如下所示的评估分数:

员工 类别 分数
约翰 5
约翰 酒吧 4
兰迪 3
兰迪 酒吧 0
丹尼尔 2
丹尼尔 酒吧 1
1
酒吧 0

我想创建另一列(“计算得分”),这样,如果他们在 Bar 类别中的得分为 0,则他们的总得分为 0(基本上,他们在 Foo 上的得分也变为 0)。否则,它只会反映他们当前的分数

所以在上面的例子中,期望的结果将是:

员工 类别 分数 计算分数
约翰 5 5
约翰 酒吧 4 4
兰迪 3 0
兰迪 酒吧 0 0
丹尼尔 2 2
丹尼尔 酒吧 1 1
1 0
酒吧 0 0

兰迪和乔现在的总分为 0,因为他们在酒吧得到了 0 分

我能够在电子表格应用程序中实现这一目标(尽管我不确定我的方法是否是最优雅的方式),方法是创建一个辅助列,该列充当员工是否有自动失败分数的“指示器”通过将他们的员工 ID(为了这个示例表,我们将使用员工字段)连接到类别和分数:

员工 类别 分数 指标
约翰 5 约翰福5
约翰 酒吧 4 约翰巴尔4
兰迪 3 兰迪福3
兰迪 酒吧 0 兰迪酒吧0
丹尼尔 2 丹尼尔福2
丹尼尔 酒吧 1 丹尼尔酒吧1
1 乔福1
酒吧 0 乔酒吧0

最后,在计算分数列中,我使用 COUNT 检查是否有 CONCATENATE(Employee, 'Bar0') 的实例,如果有,则将其设置为 0,否则将其设置为他们的分数:

=IF(COUNTIF(D:D, CONCATENATE(A2, "Bar0") ) > 0, 0, C2)

员工 类别 分数 指标 计算分数
约翰 5 约翰福5 5
约翰 酒吧 4 约翰巴尔4 4
兰迪 3 兰迪福3 0
兰迪 酒吧 0 兰迪酒吧0 0
丹尼尔 2 丹尼尔福2 2
丹尼尔 酒吧 1 丹尼尔酒吧1 1
1 乔福1 0
酒吧 0 乔酒吧0 0

有没有办法在SQL中实现这样的事情?

sql postgresql count
1个回答
0
投票

您可以使用窗口函数(仅查看当前员工的行)以及过滤器(限制该员工的“Bar”行)和

CASE WHEN
来匹配该值。如果为0,则返回0(不管当前行的类别如何,但仍然只匹配当前员工的类别),否则返回该行的分数。

不过,您需要创建一个视图,生成的列在这里不起作用(不能引用其他行,尽管也可能存在其他问题)。

架构(PostgreSQL v15)

CREATE TABLE employees (
  Employee VARCHAR(6),
  Category VARCHAR(3),
  Score INTEGER
);

INSERT INTO employees
  (Employee, Category, Score)
VALUES
  ('John', 'Foo', '5'),
  ('John', 'Bar', '4'),
  ('Randy', 'Foo', '3'),
  ('Randy', 'Bar', '0'),
  ('Daniel', 'Foo', '2'),
  ('Daniel', 'Bar', '1'),
  ('Joe', 'Foo', '1'),
  ('Joe', 'Bar', '0');

查询#1

SELECT *
     , CASE
         WHEN MIN(score) FILTER (WHERE category = 'Bar') OVER (PARTITION BY employee) = 0 THEN 0
         ELSE score
       END AS calculated_score
FROM employees
ORDER BY employee, category;
员工 类别 分数 计算的分数
丹尼尔 酒吧 1 1
丹尼尔 2 2
酒吧 0 0
1 0
约翰 酒吧 4 4
约翰 5 5
兰迪 酒吧 0 0
兰迪 3 0

在 DB Fiddle 上查看

© www.soinside.com 2019 - 2024. All rights reserved.