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