crosstab() 查询移动列

发布于 2024-12-09 02:19:53 字数 1157 浏览 5 评论 0原文

我在 postgres 中使用交叉表函数。基本 SQL 是:

select distinct  
       o_location,
       co_name,
       o_date,
       o_ndate,
       o_day,
       o_hour,
       o_type
  from outputs_txt
  left join courses on o_course = co_foreign
  left join locations on o_location = l_code
 where o_date = '2011-10-10' 
 order by o_hour

我的交叉表查询是

SELECT *
  FROM crosstab(
'SELECT DISTINCT
        COALESCE(o_location, '''')
       ,o_hour AS hour
       ,c.co_name
   FROM outputs_txt AS d
   LEFT JOIN courses AS c 
     on o_course = c.co_foreign
   LEFT JOIN locations as a 
     on o_location = a.l_code
  WHERE d.o_date = ''2011-10-10'''
)
AS ct(
 o_location varchar
,hour_0  varchar
,hour_1  varchar
,hour_2  varchar
,hour_3  varchar
,hour_4  varchar
,hour_5  varchar
,hour_6  varchar
,hour_7  varchar
,hour_8  varchar
,hour_9  varchar
,hour_10 varchar
,hour_11 varchar
,hour_12 varchar
,hour_13 varchar
,hour_14 varchar
,hour_15 varchar
,hour_16 varchar
,hour_17 varchar)

问题是结果全部左移。
例如,如果某个地点的课程应在 hour_8 显示,那么它会在 hour_0 显示。
这适用于所有地点的所有课程。它们都是左对齐的。

我哪里出错了?

I am using a crosstab function in postgres. Basic SQL is:

select distinct  
       o_location,
       co_name,
       o_date,
       o_ndate,
       o_day,
       o_hour,
       o_type
  from outputs_txt
  left join courses on o_course = co_foreign
  left join locations on o_location = l_code
 where o_date = '2011-10-10' 
 order by o_hour

My crosstab query is

SELECT *
  FROM crosstab(
'SELECT DISTINCT
        COALESCE(o_location, '''')
       ,o_hour AS hour
       ,c.co_name
   FROM outputs_txt AS d
   LEFT JOIN courses AS c 
     on o_course = c.co_foreign
   LEFT JOIN locations as a 
     on o_location = a.l_code
  WHERE d.o_date = ''2011-10-10'''
)
AS ct(
 o_location varchar
,hour_0  varchar
,hour_1  varchar
,hour_2  varchar
,hour_3  varchar
,hour_4  varchar
,hour_5  varchar
,hour_6  varchar
,hour_7  varchar
,hour_8  varchar
,hour_9  varchar
,hour_10 varchar
,hour_11 varchar
,hour_12 varchar
,hour_13 varchar
,hour_14 varchar
,hour_15 varchar
,hour_16 varchar
,hour_17 varchar)

The problem is that results are all shifted left.
For example, if a course in one location should be shown on hour_8 it is shown in hour_0.
That is for all courses in all locations. They are all aligned left.

Where am I going it wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

呆头 2024-12-16 02:19:53

由于没有样本数据,我只能猜测。这是让我印象深刻的:
您的交叉表函数中没有 ORDER BY。我添加了一个:

SELECT *
  FROM crosstab(
'SELECT DISTINCT
        COALESCE(o_location, '''')
       ,o_hour AS hour
       ,c.co_name
   FROM outputs_txt AS d
   LEFT JOIN courses AS c    ON o_course = c.co_foreign
   LEFT JOIN locations as a  ON o_location = a.l_code
  WHERE d.o_date = ''2011-10-10''
  ORDER BY 1,2'
)
AS ct(
 o_location varchar
,hour_0  varchar
,hour_1  varchar
,hour_2  varchar
,hour_3  varchar
,hour_4  varchar
,hour_5  varchar
,hour_6  varchar
,hour_7  varchar
,hour_8  varchar
,hour_9  varchar
,hour_10 varchar
,hour_11 varchar
,hour_12 varchar
,hour_13 varchar
,hour_14 varchar
,hour_15 varchar
,hour_16 varchar
,hour_17 varchar)

如果您首先想要 hour_0,则必须在 o_hour 之前订购。我引用交叉表函数手册

实际上,SQL 查询应始终指定 ORDER BY 1,2 以确保
输入行的顺序正确,即值具有
相同的 row_name 被聚集在一起并在
行。

As there are no sample data, I can only guess. Here is what strikes me:
There is no ORDER BY in your crosstab function. I added one:

SELECT *
  FROM crosstab(
'SELECT DISTINCT
        COALESCE(o_location, '''')
       ,o_hour AS hour
       ,c.co_name
   FROM outputs_txt AS d
   LEFT JOIN courses AS c    ON o_course = c.co_foreign
   LEFT JOIN locations as a  ON o_location = a.l_code
  WHERE d.o_date = ''2011-10-10''
  ORDER BY 1,2'
)
AS ct(
 o_location varchar
,hour_0  varchar
,hour_1  varchar
,hour_2  varchar
,hour_3  varchar
,hour_4  varchar
,hour_5  varchar
,hour_6  varchar
,hour_7  varchar
,hour_8  varchar
,hour_9  varchar
,hour_10 varchar
,hour_11 varchar
,hour_12 varchar
,hour_13 varchar
,hour_14 varchar
,hour_15 varchar
,hour_16 varchar
,hour_17 varchar)

If you want hour_0 first you have to order by o_hour. I quote the manual on crosstab functions:

In practice the SQL query should always specify ORDER BY 1,2 to ensure
that the input rows are properly ordered, that is, values with the
same row_name are brought together and correctly ordered within the
row.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文