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 语句中组合它们。
我有一个非常简单的查询,即 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 语句中组合它们。