在同一张表中使用有条件的计数
Posted
技术标签:
【中文标题】在同一张表中使用有条件的计数【英文标题】:USE COUNT WITH CONDITION IN THE SAME TABLE 【发布时间】:2021-09-09 12:43:39 【问题描述】:SELECT DISTINCT
P.NAME, L.ID, L.FROM, L.END, L.SALARY, L.NOTE,
CASE
WHEN (MAX(A.END) IS NULL OR MAX(A.END) >= current date )
THEN 'JES'
ELSE 'NO'
END AS "Have One "
FROM
SALARY L
INNER JOIN
CONTACT A ON A.ID = L.ID
INNER JOIN
Pep P ON P.ID = L.ID
WHERE
L.SALARY = '8000'
AND L.END >= CURRENT DATE
GROUP BY
P.NAME, L.ID, L.FROM, L.END, L.SALARY, L.NOTE
我想添加包含结果的新列:每个人有多少活动记录。当以下条件正常时,我认为记录处于活动状态
L.END >= FIRST_DAY(CURRENT DATE) AND L.FROM <= LAST_DAY(CURRENT DATE)
示例 på 结果:
|姓名 |身份证 |来自 |结束 |工资 |注意 |有一个 |积极的 |克拉 | 678 |2021-01-01 |2021-09-31| 8000 |上帝 |是 | 1 |克拉 | 678 |2021-10-01 |2021-12-31| 8000 |上帝 |是 | 1 |蒂娜 | 676 |2021-01-01 |2021-09-31| 8000 |上帝 |是 | 2 |蒂娜 | 676 |2021-06-01 |2021-12-31| 8000 |上帝 |是 | 2我该怎么做?
【问题讨论】:
SELECT DISTINCT when GROUP BY?!?没必要这么做,只会让人觉得你的代码很奇怪。 您的列别名非常不直观。我会为SALARY
选择S
,而不是L
。
如果我们看到真正的查询,我们也许可以提供进一步的帮助。您当然不会在实际查询中加入A.ID = L.ID
和P.ID = L.ID
。你真的不使用它就加入了 pep table 吗?然后你聚合。也许是因为您将行与 pep 连接相乘?还是为什么?
【参考方案1】:
看起来你可以只使用现有逻辑的条件聚合,像这样实现你的新列:
...,
SUM(
SUM(
CASE WHEN L.END >= FIRST_DAY(CURRENT DATE)
AND L.FROM <= LAST_DAY(CURRENT DATE)
THEN 1 ELSE 0 END
)
) OVER (PARTITION BY ID) AS ACTIVE
【讨论】:
这会给我所有人的总和,但我想要每个人。例如,我在表中有 1000 个人,并且每个人都有更多的一行我想添加一个新列来描述属于这个人的活动记录的数量。 @Tick_Tack 这将有助于查看实际的样本数据,但是您可能需要一个窗口聚合,我在上面进行了编辑 - 当然未经测试。 我从结果中添加了图片,我想看看 Dani,他有两条记录,但其中一条仅处于活动状态,因为它包含在本月,所以我应该在状态中添加 1,但更平静的有两条 och båda activ 因为它们都包含这个月所以我应该在状态中写 2 @Tick _Tack:您的第一条评论是错误的。您不会得到所有人的总和,而是每组一个总和。但是,由于每人有几个组,您需要每个人的总和。我已经编辑了 Stu 的答案,所以它适合您的查询。 @Tick _Tack:不,不会。斯图的计数是正确的。 0 + 1 + 0 + 0 的和是 1,而不是 4。也许您将 Stu 的SUM
更改为 COUNT
在这种情况下,ELSE
必须删除或替换为 ELSE NULL
,但只要您使用SUM
ELSE 0
很好。如果这解决了您的请求,那么您应该通过单击旁边的复选/打勾来接受 Stu 的回答。以上是关于在同一张表中使用有条件的计数的主要内容,如果未能解决你的问题,请参考以下文章