从单个SQL表中的两列中计算不同的日期

时间:2018-08-10 15:15:58

标签: mysql sql count multiple-columns

我一直在阅读这里发布的类似问题的解决方案,但似乎没有一个可以解决我的特殊问题。

我目前有一个表(CT_JOINED),该表包括三列:标识符列(TUMOURID),日期列(AVCT_DATE)和另一个日期列(OPDATE)。

例如,两个ID的列如下所示:

ID, AVCT_DATE, OPDATE
1, 06-APR-13, 06-APR-13
1, 06-APR-13, 14-JUN-13
1, 06-APR-13, 22-JUN-13
2, 03-APR-14, 10-DEC-15
2, 03-APR-14, 31-DEC-15

我要尝试做的是创建一个列,该列等于每个ID的唯一日期数。因此,ID 1的结果为3,ID 2的结果为3。

我尝试对两列中的不同值进行计数,但这没有提供上面的答案(而是分别报告了3和2的值):

select TUMOURID, COUNT(DISTINCT(AVCT_DATE || OPDATE)) AS COUNT 
FROM CT_JOINED
GROUP BY TUMOURID;

如果我尝试在新表中执行相同的操作,则会发生相同的事情:

CREATE TABLE CT_DISTINCT AS (
SELECT TUMOURID, COUNT(*) AS COUNT
FROM (
SELECT DISTINCT TUMOURID, AVCT_DATE, OPDATE
FROM CT_JOINED)
GROUP BY TUMOURID
);

我很茫然。有可能吗?

4 个答案:

答案 0 :(得分:3)

您可以使用:

SELECT TUMOURID, COUNT(DISTINCT d) AS cnt
FROM (select TUMOURID, AVCT_DATE AS d
      FROM CT_JOINED
      UNION ALL
      SELECT TUMOURID, OPDATE AS d) sub
GROUP BY TUMOURID;

答案 1 :(得分:1)

取消数据透视,然后使用count(distinct)或删除重复项:

select tumourid, count(*)
from ((select tumourid, avct_date as dte
       from ct_joined
      ) union -- intentional to remove duplicates
      (select tumourid, opdate as dte
       from ct_joined
      )
     ) t
group by tumourid;

答案 2 :(得分:1)

使用UNION避免重复日期,而只需使用count(*)即可:

SELECT tumourid, COUNT(date)
FROM ((SELECT tumourid, avct_date AS date
       FROM ct_joined
      ) UNION
      (SELECT tumourid, opdate 
       FROM ct_joined
      )
     ) t
GROUP BY tumourid;

答案 3 :(得分:0)

下面的所有答案都像一个带有一些调整的符咒,也可以解释具有空值的行。例如:

SELECT TUMOURID, COUNT(*)
FROM ((SELECT TUMOURID, AVCT_DATE AS DTE
       FROM CT_JOINED
       WHERE AVCT_DATE IS NOT NULL
      ) UNION
      (SELECT TUMOURID, OPDATE AS DTE
       FROM CT_JOINED
       WHERE OPDATE IS NOT NULL
      )
     ) T
GROUP BY TUMOURID;

非常感谢。