转置表格然后将其导出为 CSV 文件

Posted

技术标签:

【中文标题】转置表格然后将其导出为 CSV 文件【英文标题】:Transposing and then exporting a table to a CSV file 【发布时间】:2016-11-13 01:02:42 【问题描述】:

我有一个包含 3 列的 SQL 表:

我想在 Amazon Redshift(运行 PostgreSQL 8.0.2)中编写一个脚本,将上表导出为转置后的 CSV 文件。通过转置,我的意思是我想为 CSV 文件中的每个 cobrandcobrand_id 列中有 4 个不同的值)创建一个新列。为了说明我想要什么,我附上了一张图片(这些值只是说明性的):

当我尝试时:

 COPY temp_08.jwn_calc TO 'P:/SQL_New/products_199.csv' DELIMITER ',' CSV HEADER;

我收到错误:[42601] ERROR: syntax error at or near "HEADER" Position: 74

当我删除“CSV HEADER”时,我收到错误:[0A000] ERROR: COPY TO file from Xen-tables not supported

【问题讨论】:

您能澄清一下您的问题吗?你问如何转置数据?或者如何从 Redshift 导出?还是导入 Redshift? @JohnRotenstein 导出转置的数据,如果我没记错的话 我正在尝试使用 postgreSQL 以上面显示的转置方式导出数据。我正在尝试以 CSV 文件的形式将数据导出到我的本地 PC。 我还是一头雾水。您是在寻找 SQL 来进行转置,还是寻找导出数据的能力?还是两者兼而有之? @John Rotenstein 我正在寻找两者。 【参考方案1】:

转置

要转置数据,您必须编写一个专门命名每一列的查询,例如:

SELECT
  qqyy as "Quarter",
  SUM(CASE WHEN cobrand_id = 10001372 THEN sum END) as "10001372",
  SUM(CASE WHEN cobrand_id = 10005244 THEN sum END) as "10005244",
  SUM(CASE WHEN cobrand_id = 10005640 THEN sum END) as "10005640",
  SUM(CASE WHEN cobrand_id = 10006164 THEN sum END) as "10006164"
FROM input_table
GROUP BY qqyy
ORDER BY qqyy

正在保存

Amazon Redshift 中的COPY 命令可以从以下位置加载数据:

亚马逊 S3 Amazon DynamoDB Amazon EMR 集群 运行 SSH 的 Linux 主机

如果您希望将数据加载到 Redshift,您应该将 CSV(或压缩的 CSV)放入 Amazon S3 存储桶和use the COPY command to import the data。

如果您希望从 Redshift 导出数据,use the UNLOAD command to created zipped CSV files in Amazon S3。无法通过 UNLOAD 命令直接从 Redshift 下载结果。或者,在您的计算机上本地运行的 SQL 客户端可能能够将查询结果保存到文件中。

您收到的错误是由于您尝试访问 Redshift 主机的文件系统 (P:/SQL_New/products_199.csv)。这是不允许的,因为您没有登录主机的权限。

如果您已经有一个 SQL 查询可以将数据转换为您想要的,请使用UNLOAD 命令将其导出:

UNLOAD ('SELECT...FROM...') CREDENTIALS ... TO 's3://my-bucket/output.csv'

【讨论】:

嗨,John - 我正在通过 SQL IDE 访问 Redshift。我需要代码来转置如图所示的数据,最好是在 SQL 中。我要将数据保存到 (P:/SQL_New/products_199.csv) 的路径位于我的个人 PC 上。 感谢@John Rotenstein,但我希望将数据导出到我的本地/个人 PC,而不是 S3。 P:/ drive 是我 PC 上的驱动器。 不能导出到本地驱动器。唯一的方法是将UNLOAD 发送到 Amazon S3 存储桶,然后从那里下载。唯一的选择是保存 SQL IDE 中的查询结果。【参考方案2】:

如果您需要在脚本中运行它,您可以使用 psql,格式化查询以打印 csv,并将结果输出到文件。比如:

psql -t -h HOST -p 5439 -U USER -d DBNAME -o "P:/SQL_New/products_199.csvaf" -c \
"SELECT
  qqyy || ',' ||
  SUM(CASE WHEN cobrand_id = 10001372 THEN sum END)  || ',' ||
  SUM(CASE WHEN cobrand_id = 10005244 THEN sum END)  || ',' ||
  SUM(CASE WHEN cobrand_id = 10005640 THEN sum END)  || ',' ||
  SUM(CASE WHEN cobrand_id = 10006164 THEN sum END) 
FROM input_table
GROUP BY qqyy
ORDER BY qqyy"

如果你正在调度这个脚本,你需要在 ~/.pgpass 中配置你的密码

【讨论】:

以上是关于转置表格然后将其导出为 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

Python,转置列表并写入 CSV 文件

将列中的大量地址(10000)信息列表转置到 csv 中,然后在 mysql 中上传

SPSS软件中如何对数据进行转置

动态转置表格

如何将其转置为数组?

Excel PowerQuery:如何将巨大的表格反透视或转置为可读格式以进行分析