首页 新闻 会员 周边

sql 如何合并 行

0
悬赏园豆:50 [已解决问题] 解决于 2013-02-21 02:02

表数据如下,Date日期有重复,如何把相同日期的行进行合并? 让相同日期的其他列的值相加?(因为Depart列数不确定,最好只根据[Date]把表中的其他列值合并相加)

参考以下方法合并了一列 http://blog.csdn.net/dobear_0922/article/details/2313839

sql表数据如下

--Table
CREATE TABLE [dbo].[tb](
[DATE] [varchar](10) NULL,
[DepartA] [varchar](30) NULL,
[DepartB] [varchar](30) NULL,
[DepartC] [varchar](30) NULL
) 
--日期,Date有重复,日期相同时需要合并行
insert into [tb] values('2012-01-01','jack','a','f')
insert into [tb] values('2012-01-01','peter','b','g')
insert into [tb] values('2012-01-02','chalim','c','h')
insert into [tb] values('2012-01-02','kobe','d','i')
insert into [tb] values('2012-01-03','jack','e','j')
insert into [tb] values('2012-01-03','rick','m','k')
--此方法只能合并一列,如何根据[Date]合并其他行???
SELECT [DATE], [DepartA]=STUFF((SELECT ','+[DepartA] FROM [tb]  WHERE [DATE]=[tb].[DATE] FOR XML PATH('')), 1, 1, '')
FROM [tb]
GROUP BY [DATE]

或者是把数据拉出来以后放到DataTable中处理也行

谢谢!

sirili的主页 sirili | 初学一级 | 园豆:44
提问于:2013-02-20 01:40
< >
分享
最佳答案
0
SELECT DATE
, DepartA=STUFF((SELECT ','+[DepartA] FROM [tb]  WHERE [DATE]=a.[DATE] FOR XML PATH('')), 1, 1, '')
, DepartB=STUFF((SELECT ','+[DepartB] FROM [tb]  WHERE [DATE]=a.[DATE] FOR XML PATH('')), 1, 1, '')
, DepartC=STUFF((SELECT ','+[DepartC] FROM [tb]  WHERE [DATE]=a.[DATE] FOR XML PATH('')), 1, 1, '')
FROM [tb] a
GROUP BY [DATE]
收获园豆:50
li-peng | 小虾三级 |园豆:954 | 2013-02-20 11:32
其他回答(3)
0

转换成实体,操作起来就方便了

Firen | 园豆:5385 (大侠五级) | 2013-02-20 08:41
0

你的写法有点问题,改一下就可以了。

SELECT [DATE], [DepartA]=STUFF((SELECT ','+[DepartA] FROM [tb]  WHERE [DATE]=a.[DATE] FOR XML PATH('')), 1, 1, '')
, [DepartB]=STUFF((SELECT ','+[DepartB] FROM [tb]  WHERE [DATE]=a.[DATE] FOR XML PATH('')), 1, 1, '')
, [DepartC]=STUFF((SELECT ','+[DepartC] FROM [tb]  WHERE [DATE]=a.[DATE] FOR XML PATH('')), 1, 1, '')
FROM [tb] a
GROUP BY [DATE]
清海扬波 | 园豆:825 (小虾三级) | 2013-02-20 10:01

谢谢了

支持(0) 反对(0) sirili | 园豆:44 (初学一级) | 2013-02-21 02:05
0

个人建议不要把一些逻辑运算放到数据库,数据库并不擅长这些,把数据取出来后在Table中操作:

private DataTable ColSpan(DataTable dt)
{
DataTable newTable = new DataTable();
newTable.Columns.Add("DATE");
newTable.Columns.Add("DepartA");
newTable.Columns.Add("DepartB");
newTable.Columns.Add("DepartC");

int rowNum = 0;
string date = Convert.ToString(dt.Rows[0][0]);

foreach (DataRow row in dt.Rows)
{
if (date.Equals(Convert.ToString(row[0])))
{
if (rowNum == newTable.Rows.Count)
{
object[] r = { date, row[1], row[2], row[3] };
newTable.Rows.Add(r);
}
else
{
newTable.Rows[rowNum][0] = date;
newTable.Rows[rowNum][1] += string.IsNullOrEmpty(Convert.ToString(newTable.Rows[rowNum][1])) ? "" : "," + row[1];
newTable.Rows[rowNum][2] += string.IsNullOrEmpty(Convert.ToString(newTable.Rows[rowNum][1])) ? "" : "," + row[2];
newTable.Rows[rowNum][3] += string.IsNullOrEmpty(Convert.ToString(newTable.Rows[rowNum][1])) ? "" : "," + row[3];
}
}
else
{
rowNum++;
date = Convert.ToString(row[0]);
object[] r = { date, row[1], row[2], row[3] };
newTable.Rows.Add(r);
}
}
return newTable;
}

这个 方法可以实现你的要求,参数就是从数据库获取的数据(按时间排序好)

老孟Flutter | 园豆:55 (初学一级) | 2013-02-20 14:20

因为部门列数不确定,所以还是在SQL里完成了,动态SQL语句

    set @sql3=@sql3+',['+@ColName+']=STUFF((SELECT '
    set @sql3=@sql3+ ''','''+'+'
    set @sql3=@sql3+' ['+@ColName+'] '+' FROM [#tab2]  WHERE [DATE]=a.[DATE] FOR XML PATH('''')), 1, 1, '''') '
    FETCH NEXT from @cur2 into @ColName
支持(0) 反对(0) sirili | 园豆:44 (初学一级) | 2013-02-21 02:08

@sirili: 请问,你这个动态是如何做的,列数是个数组,你是通过程序去调用这个存储过程去生成的?还是说,数据库处理这个动态列的。

支持(0) 反对(0) 魏志夫 | 园豆:200 (初学一级) | 2016-08-23 09:08
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册