【问题标题】:COUNT multiple types of same columnCOUNT 多种类型的同一列
【发布时间】:2017-11-12 16:55:17
【问题描述】:

在我当前的查询中:

SELECT COUNT(WC.ID) AS "Regions" 
FROM WHOLE_FEATURES_PDB_CHAINS AS WC 
;

COUNT(WC.ID) AS "Regions" 。 但是,我们有多个区域,WC.Type 可以是1,2,3,4。我需要将每种类型的出现计数为COUNT(WC.ID) AS "Region_1"COUNT(WC.ID) AS "Region_2" ...,具体取决于WC.Type。 有没有办法在一个查询中解决这个问题?我正在看 MySQL IF,但不知道如何将它集成到 count 函数中。

我需要它在一行中(这里显示的查询减少了,这是一个更大的查询)

SELECT COUNT(WC.ID) AS "Region_1" , COUNT(WC.ID) AS "Region_2" ...

如果有人感兴趣,这里是完整的查询:

SELECT PCS.PDB_id, PCS.Chain, PPA.ENSEMBL_start, PPA.ENSEMBL_end, PPA.eValue, PIN.TITLE AS "pdbTitle", COUNT(WC.ID) AS "Regions" 
FROM PDB_Chains AS PCS 
LEFT JOIN WHOLE_FEATURES_PDB_CHAINS AS WC ON WC.PDB_CHAIN_ID = PCS.idPDB_chains, PDB_protein_alignment PPA, PDB_INFOS PIN 
WHERE PCS.idPDB_chains = PPA.idPDB_Chains 
AND PCS.PDB_id = PIN.PDB_ID 
AND PPA.idProteins = (SELECT idProteins from Proteins WHERE ENSEMBL_protein_id = "'+submittedID+'") 
GROUP BY PCS.PDB_id, PCS.Chain ORDER BY PCS.PDB_id;

这是基于您的回答的有效解决方案

SELECT PIN.TITLE AS "pdbTitle", COUNT(CASE WHEN WC.STRUCTURAL_FEATURES_ID = 1 then 1 end) AS "PPInterface" , COUNT(CASE WHEN WC.STRUCTURAL_FEATURES_ID = 4 then 1 end) AS "flexibleRegions" 
FROM PDB_Chains AS PCS LEFT JOIN WHOLE_FEATURES_PDB_CHAINS AS WC ON WC.PDB_CHAIN_ID = PCS.idPDB_chains, PDB_protein_alignment PPA, PDB_INFOS PIN 
WHERE PCS.idPDB_chains = PPA.idPDB_Chains 
AND PCS.PDB_id = PIN.PDB_ID 
AND PPA.idProteins = (SELECT idProteins from Proteins WHERE ENSEMBL_protein_id = "ENSP00000256078.4") 
GROUP BY PCS.PDB_id, PCS.Chain ORDER BY PCS.PDB_id;

【问题讨论】:

  • 使用计数(WC.type = 1 然后 1 结束的情况)作为 region_1,类似地重复另一列。
  • 谢谢@FahadAjun,这行得通...:D
  • 我可以将其发布为答案吗?
  • 当然,我已经在想你错过了名声:D

标签: mysql sql select mariadb


【解决方案1】:

您可以在聚合函数中使用 case when 语句。

试试这个。

count(WC.type = 1 then 1 end) as region_1,类似地重复另一列。

【讨论】:

  • 或者,更简洁地说,SUM(WC.type = 1) AS region_1,因为布尔值总和为 1 或 0。
【解决方案2】:
Select
...
...
sum(if WC.ID = 1 then 1 else 0) as Region1,
sum(if WC.ID = 2 then 1 else 0) as Region2,
sum(if WC.ID = 3 then 1 else 0) as Region3,
sum(if WC.ID = 4 then 1 else 0) as Region4

可以做你想做的。

【讨论】:

    【解决方案3】:

    您可以使用GROUP BYCOUNT 来获得所需的结果,例如:

    SELECT WC.Type, COUNT(WC.ID) AS "Regions" 
    FROM WHOLE_FEATURES_PDB_CHAINS AS WC 
    GROUP BY WC.Type;
    

    更新

    如果您希望将计数作为每个区域的透视列,那么您可以编写内部 SELECT 查询,例如:

    SELECT
     (SELECT COUNT(ID) FROM WHOLE_FEATURES_PDB_CHAINS WHERE type = 1) AS "Region_1",
     (SELECT COUNT(ID) FROM WHOLE_FEATURES_PDB_CHAINS WHERE type = 2) AS "Region_2",
    other_column
    FROM WHOLE_FEATURES_PDB_CHAINS AS WC
    WHERE <some condition>;
    

    【讨论】:

    • 谢谢,但我添加了一个编辑以指定它必须在一行中。如果只是为了这个,你的建议会奏效。
    • 然后我可以设置一个适用于上述子查询的整体子集吗? WHERE WC.ID = PDB.hasWholeRegionID ?我不需要表的完整计数,只需要表中的一个子集,因此需要WHERE...
    • 您不能为整个子集设置条件,但您可以使用AND将上述条件添加到每个查询中。
    • @ElDude 您想在 where 中使用条件,以便仅获得该 WC.ID 的结果?
    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2013-02-12
    • 1970-01-01
    • 2021-04-13
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多