Postgresql 返回不同行数的查询,导致交叉表错误

Postgresql 返回不同行数的查询,导致交叉表错误,postgresql,crosstab,pgadmin,Postgresql,Crosstab,Pgadmin,我的查询出现了这个错误,但我无法找出它的错误: 查询指定的返回元组有135列,但交叉表返回295列 下面是我的查询:(粗体突出显示的部分在pgAdmin中单独运行时返回相同数量的行。) 及 当分别运行时,我得到了295个正确的结果。但是,将其放在整个查询中会出现错误 其余的输出列必须具有source\u sql查询结果的最后一列的类型,并且它们的数量必须与category\u sql查询结果中的行数相同 crosstab(text,text)使用动态(!)SELECTquery作为第二个参数非

我的查询出现了这个错误,但我无法找出它的错误:

查询指定的返回元组有135列,但交叉表返回295列

下面是我的查询:(粗体突出显示的部分在pgAdmin中单独运行时返回相同数量的行。)

当分别运行时,我得到了295个正确的结果。但是,将其放在整个查询中会出现错误

其余的输出列必须具有
source\u sql
查询结果的最后一列的类型,并且它们的数量必须与
category\u sql
查询结果中的行数相同

crosstab(text,text)
使用动态(!)
SELECT
query作为第二个参数非常容易出错,因为输出列列表是静态的。您还应该动态生成输出列列表。例如:

除此之外,同一查询返回的行数不同,很可能是由于两个不同会话中的时区设置不同所致

在谓词中有表达式
TO_CHAR(b.invoicedate,'YYYY-MM-DD')
。如果
b.invoicedate
类型
timestamptz
则结果取决于
时区设置。考虑:

SET timezone = '+10';
SELECT TO_CHAR(timestamptz '2018-04-07 23:30+0', 'YYYY-MM-DD');

to_char
----------
2018-04-08

SET timezone = '-10';
SELECT TO_CHAR(timestamptz '2018-04-07 23:30+0', 'YYYY-MM-DD');

to_char
----------
2018-04-07
在我的示例中,将
欧洲/维也纳
替换为定义日期的时区名称。
请注意
2018-03-04
以包括所有您想要的2018-03-03。

其余的输出列必须具有
source\u sql
查询结果的最后一列的类型,并且它们的数量必须与
category\u sql
查询结果中的行数相同

crosstab(text,text)
使用动态(!)
SELECT
query作为第二个参数非常容易出错,因为输出列列表是静态的。您还应该动态生成输出列列表。例如:

除此之外,同一查询返回的行数不同,很可能是由于两个不同会话中的时区设置不同所致

在谓词中有表达式
TO_CHAR(b.invoicedate,'YYYY-MM-DD')
。如果
b.invoicedate
类型
timestamptz
则结果取决于
时区设置。考虑:

SET timezone = '+10';
SELECT TO_CHAR(timestamptz '2018-04-07 23:30+0', 'YYYY-MM-DD');

to_char
----------
2018-04-08

SET timezone = '-10';
SELECT TO_CHAR(timestamptz '2018-04-07 23:30+0', 'YYYY-MM-DD');

to_char
----------
2018-04-07
在我的示例中,将
欧洲/维也纳
替换为定义日期的时区名称。

注意
2018-03-04
如您所愿包含所有2018-03-03。

如果交叉表返回295列,并且如果您全部返回,则返回的列数应为295。如果您只需要135列,交叉表应该只重新调整135“相同的行数”。。。和哪个号码一样?我假设您的专栏
invoiceinfo.invoicedate
类型为
timestamptz
?@ErwinBrandstetter谢谢您的评论,我已经在更新的问题中输入了详细信息。TQ@parladneupane感谢您的评论。如果我把这两个查询分开,我得到的是相同的数字295,但是当我把它放入整个查询时,我得到了错误。我已经更新了我的问题。希望这能解释更多。多谢各位much@Sylph:数据类型如何?如果crosstab返回295列,并且如果您全部返回,则返回的列数应为295。如果您只需要135列,交叉表应该只重新调整135“相同的行数”。。。和哪个号码一样?我假设您的专栏
invoiceinfo.invoicedate
类型为
timestamptz
?@ErwinBrandstetter谢谢您的评论,我已经在更新的问题中输入了详细信息。TQ@parladneupane感谢您的评论。如果我把这两个查询分开,我得到的是相同的数字295,但是当我把它放入整个查询时,我得到了错误。我已经更新了我的问题。希望这能解释更多。多谢各位much@Sylph:数据类型如何?非常感谢您的帮助。我刚刚检查了一下,发票数据类型是:timestamp,不带时区。如果是这样的话,你知道会出什么问题吗?我也试着用你的方法,但还是有同样的错误。顺便说一句,非常感谢你的帮助,每天都在学习新的东西。非常感谢你的帮助。我刚刚检查了一下,发票数据类型是:timestamp,不带时区。如果是这样的话,你知道会出什么问题吗?我也试着用你的方法,但还是有同样的错误。顺便说一句,非常感谢你的帮助,每天都在学习新的东西。
SELECT l.locationcode FROM locationinfo l INNER JOIN invoiceinfo b ON b.location = l.locationid
 WHERE b.status !=2 AND l.locationtype = 1 AND l.status = 1 AND TO_CHAR (b.invoicedate, ''YYYY-MM-DD'')>=''2018-03-01'' AND TO_CHAR (b.invoicedate, ''YYYY-MM-DD'')<=''2018-03-03'' GROUP BY l.locationcode order by l.locationcode
SET timezone = '+10';
SELECT TO_CHAR(timestamptz '2018-04-07 23:30+0', 'YYYY-MM-DD');

to_char
----------
2018-04-08

SET timezone = '-10';
SELECT TO_CHAR(timestamptz '2018-04-07 23:30+0', 'YYYY-MM-DD');

to_char
----------
2018-04-07
$$
SELECT l.locationcode
FROM   locationinfo l
JOIN   invoiceinfo  b ON b.location = l.locationid
WHERE  b.status <> 2 AND l.locationtype = 1 AND l.status = 1
AND    b.invoicedate >=  timestamptz '2018-03-01 Europe/Vienna'
AND    b.invoicedate <   timestamptz '2018-03-04 Europe/Vienna'
GROUP  BY 1
ORDER  BY 1
$$