我一直在阅读这里发布的类似问题的解决方案,但似乎没有一个可以解决我的特殊问题。
我目前有一个表(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
);
我很茫然。有可能吗?
答案 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;
非常感谢。