SQL根据结果数添加列

时间:2017-11-25 21:26:14

标签: sql postgresql

我试图在新列中添加string_agg的日期

SELECT g.ganado_id,
       string_agg(i.date, ', ') AS date
FROM   inseminacion i 
       INNER JOIN ganado g
           ON g.ganado_id = i.ganado_id
GROUP BY g.ganado_id

实际输出

|ganado_id|date                               |
|1        |2016-10-15                         |
|2        |2016-10-15, 2017-02-15             |
|3        |2016-10-15, 2017-03-09, 2017-05-27 |
|4        |2017-06-02                         |

期望的输出

|ganado_id|date1      |date2      |date3      |
|1        |2016-10-15 |           |           |
|2        |2016-10-15 |2017-02-15 |           |
|3        |2016-10-15 |2017-03-09 |2017-05-27 |
|4        |2017-06-02 |           |           |

我的第一印象是使用数据透视表,但我无法弄清楚如何

2 个答案:

答案 0 :(得分:0)

您的查询不需要两个表格。 。 。换句话说,*p不是必需的:

<< 8

答案 1 :(得分:0)

我意识到你已经有了答案,但是为了其他可能有类似问题的人的利益,我提供了使用PostgreSQL优秀阵列的替代方案,这是其中一个特点。我很难回到使用任何其他DBMS。

SELECT g.ganado_id,
       array_agg(i.date) AS dates
FROM   inseminacion i 
       INNER JOIN ganado g
           ON g.ganado_id = i.ganado_id
GROUP BY g.ganado_id

就其本身而言,这实际上可能完全满足您的需求。它具有非常可扩展的额外优势,因此如果您的阵列超出了三个元素,您就不需要改变它。

此外,如果您需要将其转换为您列出的格式,那将是一项相对简单的任务:

with cte as (
    SELECT g.ganado_id,
           array_agg(i.date) AS dates
    FROM   inseminacion i 
           INNER JOIN ganado g
               ON g.ganado_id = i.ganado_id
    GROUP BY g.ganado_id
)
select
  ganado_id, dates[1], dates[2], dates[3]
from cte

当然,如果你有第四个和第五个约会的那一天到来,那将会很简单:

select
  ganado_id, dates[1], dates[2], dates[3], dates[4], dates[5]
from cte