是否有一个 SQL 命令来计算一个值在不同列中的频率?
Is there an SQL command to count frequencies of a value in different columns?
我有一个非常大的教育项目捐赠数据集。我已经做了一些处理,对于这个问题,有三个 table 感兴趣:项目、资金和类别。
- 项目包含项目 ID、其他一些可忽略的信息(例如开始日期)以及项目所属的类别 ID。项目可以属于一个或两个类别,因此每个项目有两列。如果一个项目只属于一个类别,则类别 2 为 NULL。总共有 8 个类别,类别 ID 从 1 到 8。
- Funding 包含项目 ID、其他一些可忽略的信息(例如总成本)和项目的当前状态。这是 'fully funded' 或 'expired',因为所有项目都已完成。
- 类别仅包含 2 列,一列包含 8 个类别 ID,另一列包含类别名称(1 - 体育,2 - 科学等)。
*Project*
project_id category_id1 category_id2
... ... ...
... ... ...
*Funding*
project_id status
... ...
... ...
*Category*
Category_ID project_category
... ...
... ...
我现在正试图找出每个类别的完全资助者的百分比,即(完全资助)/(完全资助 + 过期)。但是,我似乎无法找到一种方法来使 SQL 对每个类别的实例进行计数,而不管它们是在 'Project' table 的类别列 1 还是类别列 2 中。这是我到目前为止的输出代码:
SELECT project_category, status, count(project_category)
FROM Project
INNER JOIN Category ON Project.Category_ID1 = Category.Category_ID
INNER JOIN Funding ON Project.project_id = Funding.project_id
GROUP BY project_category, status
project_category status count(project_category)
Applied Learning Expired 4003
Applied Learning Fully Funded 11441
Essentials Expired 16
Essentials Fully Funded 219
Health & Sports Expired 1235
Health & Sports Fully Funded 4518
... .... ...
... .... ...
此输出仅计算项目中的类别。category_id1。我可以为项目再做一个 table。category_id2 并手动添加它们,但我宁愿做一个 table。有没有办法做到这一点?
感谢您的帮助!!
您可以逆透视然后聚合:
SELECT c.project_category, f.status, count(*)
FROM (SELECT p.project_id1 as project_id, p.Category_ID FROM Project p
UNION ALL
SELECT p.project_id2 as project_id, p.Category_ID FROM Project p
) p JOIN
Category c
ON p.Category_ID = c.Category_ID JOIN
Funding f
ON p.project_id = f.project_id
GROUP BY c.project_category, f.status;
请注意,这还引入了 table 别名和合格的 all 列引用。
Here 是一个 db<>fiddle.
我有一个非常大的教育项目捐赠数据集。我已经做了一些处理,对于这个问题,有三个 table 感兴趣:项目、资金和类别。
- 项目包含项目 ID、其他一些可忽略的信息(例如开始日期)以及项目所属的类别 ID。项目可以属于一个或两个类别,因此每个项目有两列。如果一个项目只属于一个类别,则类别 2 为 NULL。总共有 8 个类别,类别 ID 从 1 到 8。
- Funding 包含项目 ID、其他一些可忽略的信息(例如总成本)和项目的当前状态。这是 'fully funded' 或 'expired',因为所有项目都已完成。
- 类别仅包含 2 列,一列包含 8 个类别 ID,另一列包含类别名称(1 - 体育,2 - 科学等)。
*Project*
project_id category_id1 category_id2
... ... ...
... ... ...
*Funding*
project_id status
... ...
... ...
*Category*
Category_ID project_category
... ...
... ...
我现在正试图找出每个类别的完全资助者的百分比,即(完全资助)/(完全资助 + 过期)。但是,我似乎无法找到一种方法来使 SQL 对每个类别的实例进行计数,而不管它们是在 'Project' table 的类别列 1 还是类别列 2 中。这是我到目前为止的输出代码:
SELECT project_category, status, count(project_category)
FROM Project
INNER JOIN Category ON Project.Category_ID1 = Category.Category_ID
INNER JOIN Funding ON Project.project_id = Funding.project_id
GROUP BY project_category, status
project_category status count(project_category)
Applied Learning Expired 4003
Applied Learning Fully Funded 11441
Essentials Expired 16
Essentials Fully Funded 219
Health & Sports Expired 1235
Health & Sports Fully Funded 4518
... .... ...
... .... ...
此输出仅计算项目中的类别。category_id1。我可以为项目再做一个 table。category_id2 并手动添加它们,但我宁愿做一个 table。有没有办法做到这一点? 感谢您的帮助!!
您可以逆透视然后聚合:
SELECT c.project_category, f.status, count(*)
FROM (SELECT p.project_id1 as project_id, p.Category_ID FROM Project p
UNION ALL
SELECT p.project_id2 as project_id, p.Category_ID FROM Project p
) p JOIN
Category c
ON p.Category_ID = c.Category_ID JOIN
Funding f
ON p.project_id = f.project_id
GROUP BY c.project_category, f.status;
请注意,这还引入了 table 别名和合格的 all 列引用。
Here 是一个 db<>fiddle.