如何计算同一张表的两个不同行中的值?

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

我试图计算这些值,如果PFPR 或两者都与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 for emp 3, countVal= 2 因为与行 emp 1 比较,PFPR 的值是相同的。在这种情况下,1020 分别对应于 PFPR 【参考方案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

以上是关于如何计算同一张表的两个不同行中的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算同一张表中 2 个不同行之间的时间差?

SQLite如何计算同一张表的两个变量之间的差异[关闭]

如何比较来自同一列和不同行但同一表的值?

如何在phpmyadmin中关联同一张表的两个字段?

在一个表中的不同行和不同列中查找相同的值SQL

mysql同一张表中两个字段 关联另一张表的相同字段 查询出两个值