转置然后将表导出到CSV文件

时间:2016-11-13 01:02:43

标签: sql postgresql csv amazon-redshift

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

enter image description here

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

enter image description here

当我尝试:

 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

2 个答案:

答案 0 :(得分: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

<强> SAVING

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

  • Amazon 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'

答案 1 :(得分:0)

如果需要在脚本中运行它,可以使用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

中配置密码