SQL 计算出现在不同列中的不同值
SQL count distinct values appearing in different columns
我想计算不同的值并报告它们在 SQL 中的出现。问题是我需要计算不同列上的出现次数,然后为每一列报告每个值的出现次数。所以,假设我从一个名为 Result :
的 table 中获得了这样的数据
Id
OwnerId
PilotId
CoachId
A
1
2
3
B
2
2
3
C
3
1
3
那么我的结果应该是:
Id
Owner
Pilot
Coach
1
1
1
0
2
1
2
0
3
1
0
3
我尝试将 COUNT 函数与联合一起使用以单独获取每个结果并且它有效。但我想在同一行 per Id 上得到结果。谁能帮我解决这个问题?
我认为您想将列逆透视为行,然后计算每个值的出现次数。你可以这样做:
select v.id,
sum(case when v.col = 'owner' then 1 else 0 end) owner,
sum(case when v.col = 'pilot' then 1 else 0 end) pilot,
sum(case when v.col = 'coach' then 1 else 0 end) coach
from mytable t
cross apply (values (t.ownerid, 'owner'), (t.pilotid, 'pilot'), (t.coachid, 'coach')) as v(id, col)
group by v.id
id | owner | pilot | coach
-: | ----: | ----: | ----:
1 | 1 | 1 | 0
2 | 1 | 2 | 0
3 | 1 | 0 | 3
同样使用基本的 SQL
命令。确保在每个 DBMS 上工作:
SELECT
ids.id,
SUM(CASE WHEN ro.ownerid = ids.id THEN 1 ELSE 0 END) AS Owner,
SUM(CASE WHEN po.pilotid = ids.id THEN 1 ELSE 0 END) AS Pilot,
SUM(CASE WHEN co.coachid = ids.id THEN 1 ELSE 0 END) AS Coach
FROM (
SELECT ownerID AS id FROM result UNION
SELECT pilotID FROM result UNION
SELECT coachID FROM result
) ids
LEFT JOIN result ro ON ids.id = ro.ownerid
LEFT JOIN result po ON ids.id = po.pilotid
LEFT JOIN result co ON ids.id = co.coachid
GROUP BY ids.id
我想计算不同的值并报告它们在 SQL 中的出现。问题是我需要计算不同列上的出现次数,然后为每一列报告每个值的出现次数。所以,假设我从一个名为 Result :
的 table 中获得了这样的数据Id | OwnerId | PilotId | CoachId |
---|---|---|---|
A | 1 | 2 | 3 |
B | 2 | 2 | 3 |
C | 3 | 1 | 3 |
那么我的结果应该是:
Id | Owner | Pilot | Coach |
---|---|---|---|
1 | 1 | 1 | 0 |
2 | 1 | 2 | 0 |
3 | 1 | 0 | 3 |
我尝试将 COUNT 函数与联合一起使用以单独获取每个结果并且它有效。但我想在同一行 per Id 上得到结果。谁能帮我解决这个问题?
我认为您想将列逆透视为行,然后计算每个值的出现次数。你可以这样做:
select v.id,
sum(case when v.col = 'owner' then 1 else 0 end) owner,
sum(case when v.col = 'pilot' then 1 else 0 end) pilot,
sum(case when v.col = 'coach' then 1 else 0 end) coach
from mytable t
cross apply (values (t.ownerid, 'owner'), (t.pilotid, 'pilot'), (t.coachid, 'coach')) as v(id, col)
group by v.id
id | owner | pilot | coach -: | ----: | ----: | ----: 1 | 1 | 1 | 0 2 | 1 | 2 | 0 3 | 1 | 0 | 3
同样使用基本的 SQL
命令。确保在每个 DBMS 上工作:
SELECT
ids.id,
SUM(CASE WHEN ro.ownerid = ids.id THEN 1 ELSE 0 END) AS Owner,
SUM(CASE WHEN po.pilotid = ids.id THEN 1 ELSE 0 END) AS Pilot,
SUM(CASE WHEN co.coachid = ids.id THEN 1 ELSE 0 END) AS Coach
FROM (
SELECT ownerID AS id FROM result UNION
SELECT pilotID FROM result UNION
SELECT coachID FROM result
) ids
LEFT JOIN result ro ON ids.id = ro.ownerid
LEFT JOIN result po ON ids.id = po.pilotid
LEFT JOIN result co ON ids.id = co.coachid
GROUP BY ids.id