表数据如下,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中处理也行
谢谢!
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]
转换成实体,操作起来就方便了
你的写法有点问题,改一下就可以了。
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]
谢谢了
个人建议不要把一些逻辑运算放到数据库,数据库并不擅长这些,把数据取出来后在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;
}
这个 方法可以实现你的要求,参数就是从数据库获取的数据(按时间排序好)
因为部门列数不确定,所以还是在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
@sirili: 请问,你这个动态是如何做的,列数是个数组,你是通过程序去调用这个存储过程去生成的?还是说,数据库处理这个动态列的。