如何计算同一张表的两个不同行中的值?
Posted
技术标签:
【中文标题】如何计算同一张表的两个不同行中的值?【英文标题】:How to count the values in two different rows of same table? 【发布时间】:2018-12-08 18:54:32 【问题描述】:我有一张如下表:
emp PR PF
--- --- ---
1 10 20
2 30 20
3 10 20
4 5 6
我试图计算这些值,如果PF
或PR
或两者都与emp 1 相同,那么计数应该增加。
例如,emp 2
的 PF 与 emp 1
相同,因此此处的计数应为 1,表示 emp 2。
我正在尝试为给定的表格示例获得如下输出:
emp countVal
--- --------
2 1
3 2
我使用自联接编写了以下查询,但它没有给我所需的输出。
SELECT e.emp,sum(CASE When e1.PR=e2.PR Then 1
When e1.PF=e2.PF Then 1
Else 0 End ) as countVal
FROM
employee e1
INNER JOIN employee e2
ON e1.emp=e2.emp and e1.emp!=1
group by e1.emp
谁能告诉我在这里到底要做什么?
【问题讨论】:
我无法理解逻辑。你能解释一下第一个例子(emp=1,2)与第二个“结果(emp=2,3)的关系吗?还有什么ebout emp=4? @krokodilko 这只是我展示如何比较两行的示例。另一个 (emp=2,3) 是所需的输出。 问题:如何得到emp=3 和countVal=2 的输出?总和是什么? @J.Francis foremp 3
, countVal
= 2 因为与行 emp 1
比较,PF
和 PR
的值是相同的。在这种情况下,10
和 20
分别对应于 PF
和 PR
。
【参考方案1】:
好的,输出不会这样,因为您需要在所有 emp 之间进行组合。无法猜测您需要哪些:
select *,
CAST((t1.PR = t2.PR) as int) + cast(t1.PF = t2.PF) as int) as countValue from empTable t1
cross join empTable t2
祝你好运!
【讨论】:
实际比较emp 1的PF和PR值与其他员工。我需要 emp 2 和 emp 3 出现在结果中,因为它们具有 PF 或 PR 或两者兼有,与 emp 1 相同。 @ABeginner 我认为此查询完全符合您在此评论中所说的内容,交叉连接非常适合这种组合。是吗?【参考方案2】:我想你想要:
SELECT e.emp,
( (e.PR = e1.PR)::int + (e.PF = e1.PF)::int ) as countVal
FROM employee e JOIN
employee e1
ON e1.emp = 1;
注意事项:
不需要聚合。每行似乎只有一名员工,这就是您想要的结果集中。 这使用 Postgres 使用::
将类型从布尔值转换为整数。
【讨论】:
这个查询只给我 emp 1。但我期望的输出是 emp 2 和 emp 3,因为这些是具有 PF 或 PR 或两者兼有的员工,与 emp 1 相同跨度> 我已经更新了我的问题。我希望现在要求更清楚。 @ABeginner 。 . .join
条件不合适。你基本上想要一个cross join
。以上是关于如何计算同一张表的两个不同行中的值?的主要内容,如果未能解决你的问题,请参考以下文章