标题
select d.display_name, ptp.start_time::timestamp::date,count(d.display_name)
from qa.dre d
join qa.TPreTrePre ptp
on d.id = ptp.doctor_id
group by d.display_name, ptp.start_time;
该查询给出的是上面输出的图像,现在,我想使用交叉表使用交叉表检查单个日期中的Dre数。但是我无法获得所需的输出。
我的交叉表查询-
select * from crosstab
('select d.display_name, ptp.start_time::timestamp::date,count(d.display_name)
from qa.dre d
join qa.TPreTrePre ptp
on d.id = ptp.dre_id
group by d.display_name, ptp.start_time')
as name (display_name VARCHAR , start_time timestamp);
错误-
错误:返回和sql元组描述不兼容的SQL状态:42601
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你的描述,你想要使用crosstab
函数来生成一个交叉表,以展示每个display_name
在不同日期的count
。但是,你遇到的错误表明SQL查询与预期的数据结构不匹配。这通常是因为crosstab
函数需要特定的格式输入,并且必须指定分类列(categories)和值列(values)。在PostgreSQL中,使用crosstab
函数时,你需要借助tablefunc
扩展,并且明确指定分类列和值列。
这里是一个修正后的示例,假设你想按每天统计每个display_name
的数量:
首先,确保你已经安装了tablefunc
扩展:
CREATE EXTENSION IF NOT EXISTS tablefunc;
然后,调整你的crosstab
查询。你需要明确指定哪一列作为行标签(这里是start_time::timestamp::date
),哪一列作为列标签(这里是display_name
),以及哪一列是填充交叉表的值(这里是count(d.display_name)
)。注意,对于动态的日期列,通常需要预先知道所有可能的日期,或者使用程序逻辑生成相应的查询字符串。
以下是一个基本示例,但请注意,由于实际日期范围未知,我将使用一个假设的日期列表来演示如何构造查询。在实际应用中,你可能需要根据实际情况动态生成这部分查询语句。
SELECT *
FROM crosstab(
'SELECT d.display_name, ptp.start_time::timestamp::date AS day, count(d.display_name) AS count
FROM qa.dre d
JOIN qa.TPreTrePre ptp ON d.id = ptp.doctor_id
GROUP BY d.display_name, ptp.start_time::timestamp::date
ORDER BY 1,2',
-- 这里列出所有可能的日期,实际应用中可能需要通过子查询或其他方式动态生成
'VALUES (''2023-04-01''), (''2023-04-02''), (''2023-04-03'')'
) AS ct(display_name VARCHAR, "2023-04-01" INT, "2023-04-02" INT, "2023-04-03" INT);
请根据你的具体日期范围替换上述示例中的日期列表。如果日期范围很大或不确定,考虑编写一个脚本或存储过程来动态构建这个查询字符串。