具有多列和工作日的 PostgreSQL 交叉表查询
PostgreSQL crosstab query with multiple columns and week day
我正在尝试通过对以下几列进行分组来创建一个数据透视表:用户 ID、姓名、周数和星期几。
当前请求没有给出想要的结果。
我需要帮助。
这是我的table:
user_id name week_number day_name price
2 Luc 8 Sunday 10
2 Luc 8 Monday 15
2 Luc 8 Tuesday 8
2 Luc 8 Wednesday 2
2 Luc 8 Thursday 9
2 Luc 8 Friday 9
2 Luc 8 Saturday 11
2 Luc 9 Saturday 1
2 Luc 9 Friday 13
3 Mathieu 8 Sunday 22
3 Mathieu 8 Monday 13
3 Mathieu 8 Tuesday 9
3 Mathieu 8 Wednesday 3
这是我当前的请求:
SELECT *
FROM crosstab(
'SELECT user_id, name, week_number,day_name,price
FROM table_1
ORDER BY 1,2,3,4'
) AS ct (
"user_id" integer,
"day_name" text,
"Sunday" integer,
"Monday" integer,
"Tuesday" integer,
"Wednesday" integer,
"Thursday" integer,
"Friday" integer,
"Saturday" integer
);
这是我想要得到的结果。
您可以只使用条件聚合:
SELECT user_id, name, week_number
MAX(price) FILTER (WHERE day_name = 'Sunday') as Sunday,
MAX(price) FILTER (WHERE day_name = 'Monday') as Monday,
MAX(price) FILTER (WHERE day_name = 'Tuesday') as Tuesday,
MAX(price) FILTER (WHERE day_name = 'Wednesday') as Wednesday,
MAX(price) FILTER (WHERE day_name = 'Thursday') as Thursday,
MAX(price) FILTER (WHERE day_name = 'Friday') as Friday,
MAX(price) FILTER (WHERE day_name = 'Saturday') as Saturday
FROM table_1
GROUP BY user_id, name, week_number
ORDER BY user_id, name, week_number;
编辑:
不用FILTER
也可以写出同样的逻辑:
MAX(CASE WHEN day_name = 'Sunday' THEN price END) as Sunday,
我正在尝试通过对以下几列进行分组来创建一个数据透视表:用户 ID、姓名、周数和星期几。 当前请求没有给出想要的结果。 我需要帮助。
这是我的table:
user_id name week_number day_name price
2 Luc 8 Sunday 10
2 Luc 8 Monday 15
2 Luc 8 Tuesday 8
2 Luc 8 Wednesday 2
2 Luc 8 Thursday 9
2 Luc 8 Friday 9
2 Luc 8 Saturday 11
2 Luc 9 Saturday 1
2 Luc 9 Friday 13
3 Mathieu 8 Sunday 22
3 Mathieu 8 Monday 13
3 Mathieu 8 Tuesday 9
3 Mathieu 8 Wednesday 3
这是我当前的请求:
SELECT *
FROM crosstab(
'SELECT user_id, name, week_number,day_name,price
FROM table_1
ORDER BY 1,2,3,4'
) AS ct (
"user_id" integer,
"day_name" text,
"Sunday" integer,
"Monday" integer,
"Tuesday" integer,
"Wednesday" integer,
"Thursday" integer,
"Friday" integer,
"Saturday" integer
);
这是我想要得到的结果。
您可以只使用条件聚合:
SELECT user_id, name, week_number
MAX(price) FILTER (WHERE day_name = 'Sunday') as Sunday,
MAX(price) FILTER (WHERE day_name = 'Monday') as Monday,
MAX(price) FILTER (WHERE day_name = 'Tuesday') as Tuesday,
MAX(price) FILTER (WHERE day_name = 'Wednesday') as Wednesday,
MAX(price) FILTER (WHERE day_name = 'Thursday') as Thursday,
MAX(price) FILTER (WHERE day_name = 'Friday') as Friday,
MAX(price) FILTER (WHERE day_name = 'Saturday') as Saturday
FROM table_1
GROUP BY user_id, name, week_number
ORDER BY user_id, name, week_number;
编辑:
不用FILTER
也可以写出同样的逻辑:
MAX(CASE WHEN day_name = 'Sunday' THEN price END) as Sunday,