SQL将前2个字段值合并为1个值

时间:2015-05-22 16:12:43

标签: sql teradata

我有一个非常简单的查询返回Notes字段。既然可以有多个音符,我只想要前2个。没问题。但是,我将在另一个查询中使用sql。我的结果中我真的不想要2行。我想将结果合并为1个字段值,因此我在结果中只有1个结果行。这可能吗?

例如,我目前得到以下内容:

12345     1001     500.00   "Note 1"
12345     1001     500.00   "Note 2"

我希望看到的是:

12345     1001     500.00   "Note 1 AND Note 2"

以下是sql:

select top 2 rcai.field_value
from rnt_agrs ra 
inner join rnt_agr_inv_notes rain on ra.rnt_agr_nbr=rain.rea_rnt_agr_nbr
inner join RNT_CUST_ADDNL_INFO rcai on rain.rea_rnt_agr_nbr=rcai.rea_rnt_agr_nbr and rain.bac_acc_id=rcai.bac_acct_id
where ra.rnt_agr_nbr=128260511

感谢您的帮助。我很感谢这个论坛帮助解决这些问题......

3 个答案:

答案 0 :(得分:1)

获取下一行的值并过滤除第一行以外的所有内容:

select ..., rcai.field_value || ' AND ' 
   min(rcai.field_value)  -- next row's value (same as LEAD in Standard SQL)
   over (partition by ra.rnt_agr_nbr
         order by rcai.field_value
         rows between 1 following and 1 following) as next_field_value   
from rnt_agrs ra 
inner join rnt_agr_inv_notes rain on ra.rnt_agr_nbr=rain.rea_rnt_agr_nbr
inner join RNT_CUST_ADDNL_INFO rcai on rain.rea_rnt_agr_nbr=rcai.rea_rnt_agr_nbr and rain.bac_acc_id=rcai.bac_acct_id
where ra.rnt_agr_nbr=128260511
qualify
   row_number()   -- only the first row 
   over (partition by ra.rnt_agr_nbr
         order by rcai.field_value) = 1

如果可能只有一行,则需要添加COALESCE(min...,'')以消除NULL。

两个OLAP函数都指定相同的PARTITION和ORDER,因此这是一个单一的工作步骤。

答案 1 :(得分:0)

select *,(SELECT top 2 rcai.field_value + ' AND ' AS [text()]
                            FROM          RNT_CUST_ADDNL_INFO rcai 
                            WHERE      rcai.rea_rnt_agr_nbr = rain.rea_rnt_agr_nbr
                                       AND rcai.bac_acct_id=rain.bac_acc_id
                                      FOR XML PATH('')) AS Notes
from 
rnt_agrs ra inner join rnt_agr_inv_notes rain 
on ra.rnt_agr_nbr=rain.rea_rnt_agr_nbr

我有类似的东西,其中有1到多个,我想在一个列中使用分号分隔的一组值与主记录。

答案 2 :(得分:0)

您可以使用PIVOT根据行号将两个音符行转换为两个音符列,然后将它们连接起来。这是一个例子:

SELECT pvt.[1] + ' and ' + pvt.[2]
FROM
(   --the selection of your table data, including a row-number column
    SELECT Msg, ROW_NUMBER() OVER(ORDER BY Id)
    --sample data shown here, but this would be your real table
    FROM (VALUES(1, 'Note 1'), (2, 'Note 2'), (3, 'Note 3')) Note(Id, Msg)
) Data (Msg, Row)
PIVOT (MAX(Msg) FOR Row IN ([1], [2])) pvt

请注意,MAX用于PIVOT中的聚合,因为需要聚合,但由于ROW_NUMBER是唯一的,因此您只聚合单个值。

这也可以很容易地扩展到前N行 - 只需在枢轴中包含您想要的行号,并在select语句中根据需要将它们组合在一起。