开发者社区 问答 正文

PostgreSQL中的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.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

展开
收起
垚tutu 2019-12-26 21:15:29 1620 分享 版权
阿里云 AI 助理回答

根据你的描述,你想要使用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);

请根据你的具体日期范围替换上述示例中的日期列表。如果日期范围很大或不确定,考虑编写一个脚本或存储过程来动态构建这个查询字符串。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答