原始数据:
字段1 字段2 字段3 字段4
01 25100135301 a 16
01 25100135301 b 12
01 60300100001 a 10需要的结果:
字段1 字段2 字段3 字段4
01 25100135301 a,b 16+12=28
01 60300100001 a 10
sql
字段1 字段2 字段3 字段4
01 25100135301 a 16
01 25100135301 b 12
01 60300100001 a 10需要的结果:
字段1 字段2 字段3 字段4
01 25100135301 a,b 16+12=28
01 60300100001 a 10
sql
DECLARE @B TABLE(col1 VARCHAR(6),col2 varchar(60),col3 varchar(6),col4 int)
INSERT INTO @B
SELECT '01','25100135301','a',16 UNION ALL
SELECT '01','25100135301','b',12 UNION ALL
SELECT '01','60300100001','a',10
SELECT col1,col2,
STUFF(
(SELECT ', ' + CONVERT(VARCHAR(100),col3) FROM @B T1 WHERE T1.col2 = T2.col2 FOR XML PATH('')),1,1,''
) AS col3,sum(col4) col4
FROM @B T2
GROUP BY col1,col2
原始数据是这样来的:select 字段1,字段2,字段3,字段4 from 表 where ……
后面where 的条件是用户根据需要自己定义的所以1楼stuff里面的select也要加上一样的where条件,但是这个程序是不允许加的。因此stuff里面的查询既要关联@B表也要有跟@B一样的集合。这个不知道有没有办法
;with B as(
select .... from tbl where ...
)select .... from b ....
group by 字段1 ,字段2
写到存储过程中去 调用存储过程啊
变通一点行不行!
程序不支持存储过程,不支持函数,不支持参数,不支持CTE,支持视图,只能SELECT ... FROM ...WHERE..这样写一句
一开始我没说清楚,字段2不是唯一的,字段5是唯一的,上面各位据的例子不加where条件的时候可以实现,但是用户用的时候在外面一个select中加了条件 ,在里面一个for xml的select中不能加条件,所以数据是有问题的。
原始数据:
字段1 字段2 字段3 字段4 字段5
01 25100135301 a 16 1
01 25100135301 b 12 2
01 60300100001 a 10 3
(
ID VARCHAR(20),
COLONE VARCHAR(50),
COLTWO VARCHAR(20),
COLTHREE INT
)INSERT INTO T_CSDN_ONE
SELECT '01','25100135301','a',16
UNION ALL
SELECT '01','25100135301','b',12
UNION ALL
SELECT '01','60300100001','a',10DROP FUNCTION dbo.F_GetStringByColTwoCREATE FUNCTION F_GetStringByColTwo(@COLONE AS VARCHAR(20))
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE @COLTWO VARCHAR(20)
SET @COLTWO='';
SELECT @COLTWO= @COLTWO+(CASE @COLTWO WHEN '' THEN '' ELSE ',' END)+CASE COLTWO WHEN COLTWO THEN COLTWO END
FROM T_CSDN_ONE WHERE COLONE=@COLONE GROUP BY COLTWO
return @COLTWO;
END
SELECT A.COLONE,
dbo.F_GetStringByColTwo(a.COLONE)
,SUM(A.COLTHREE)FROM T_CSDN_ONE A GROUP BY A.COLONE