如何在sql中使用GROUPBY子句替换字符串?
在下表中,我需要根据组“Yearmonth”将列“Formula”中的字符串替换为匹配的输入“VALUE”列如何在sql中使用GROUPBY子句替换字符串?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在下表中,我需要根据组“Yearmonth”将列“Formula”中的字符串替换为匹配的输入“VALUE”列 IDNUM formula INPUTNAME VALUE YEARMONTH --------------------------------------------------------------------- 1 imports(398)+imports(399) imports(398) 17.
IDNUM formula INPUTNAME VALUE YEARMONTH
---------------------------------------------------------------------
1 imports(398)+imports(399) imports(398) 17.000 2003:1
2 imports(398)+imports(399) imports(398) 56.000 2003:2
3 imports(398)+imports(399) imports(399) 15.000 2003:1
4 imports(398)+imports(399) imports(399) 126.000 2003:2
例如:从上表中,我需要输出为
Idnum Formula Yearmonth
1. 17.00 +15.00 2003:1
2. 56.00 +126.00 2003:2
我尝试了下面的查询,但未能实现。如何做到这一点
SELECT
REPLACE(FORMULA, INPUTName, AttributeValue) AS realvalues,
yearmonth
FROM table1
GROUP BY yearmonth
将
用于XML路径
用于连接:
SELECT
IDNUM = MIN(IDNUM),
FORMULA =
(SELECT STUFF(
(SELECT ' +' + CONVERT(VARCHAR(10), Value)
FROM Table1
WHERE YEARMONTH = t1.YEARMONTH
FOR XML PATH(''))
,1, 2, '')),
YEARMONTH
FROM Table1 t1
GROUP BY YEARMONTH
不幸的是,这种类型的替换需要递归:
with t as (
select t.*,
row_number() over (partition by yearmonth order by idnum) as seqnum,
count(*) over (partition by yearmonth) as cnt
from table t
),
cte as (
select t.seqnum, t.yearmonth, t.cnt,
replace(formula, inputname, value) as formula
from t
where seqnum = 1
union all
select cte.seqnum, cte.yearmonth, cte.cnt,
replace(formula, t.inputername, t.value)
from cte join
t
on cte.yearmonth = t.yearmonth and t.seqnum = cte.seqnum + 1
)
select row_number() over (order by (select null)) as id,
formula
from cte
where seqnum = cnt;
如果您需要列idnum,请尝试以下操作
declare @t table (idnum int identity(1,1),formula varchar(100),Yearmonth date)
insert into @t
SELECT t1.yearmonth,
formula=REPLACE( (SELECT value AS [data()]
FROM table t2
WHERE t2.YEARMONTH= t1.YEARMONTH
ORDER BY value
FOR XML PATH('')
), ' ', '+')
FROM table t1
GROUP BY YEARMONTH ;
这个很好用。。。非常感谢……我有一个问题,这适用于表中的任何类型的字符串还是仅适用于这种类型的字符串??似乎这个查询适用于公式中有“+”的字符串。。。。有没有办法只替换字符串名而不考虑数学符号?谢谢你的建议。。。但是我相信querey需要一些修改。。我有点难以获得输出…嗨,戈登。。。。我尝试了代码执行,但只得到了null值…你能帮我实现这一点吗one@JamesRodix . . . 你能安装SQL小提琴吗?嗨。。。谢谢你的建议。。。Felix Pamittan的建议都是一样的。。。请听我对他的建议的评论。。那可能吗??
declare @t table (idnum int identity(1,1),formula varchar(100),Yearmonth date)
insert into @t
SELECT t1.yearmonth,
formula=REPLACE( (SELECT value AS [data()]
FROM table t2
WHERE t2.YEARMONTH= t1.YEARMONTH
ORDER BY value
FOR XML PATH('')
), ' ', '+')
FROM table t1
GROUP BY YEARMONTH ;