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

SQL Combing the top 2 field values into 1 value

我有一个非常简单的查询,即 returns 注释字段。由于可以有多个笔记,我只想要前 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

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

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

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,因此这是一个单一的工作步骤。

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 对多,我想要在包含主记录的单个列中使用分号分隔的一组值。

您可以使用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 语句中组合它们。