我有一个包含3列的SQL表:
我想在Amazon Redshift(运行PostgreSQL 8.0.2)中编写一个脚本,将上表导出为转换后的CSV文件。通过转置,我的意思是我想为CSV文件中的每个cobrand
创建一个新列(cobrand_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
答案 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
命令可以从以下位置加载数据:
如果您希望将数据加载到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
中配置密码