当前位置: 代码迷 >> C# >> C# DataTable重新排列组合有关问题
  详细解决方案

C# DataTable重新排列组合有关问题

热度:433   发布时间:2016-04-28 08:32:11.0
C# DataTable重新排列组合问题
已知在数据库中使用存储过程查询到如下表

注意图中黄色部分的二三四列都是一样的,只是后面送货日期不一样。
要求重新组合成如下样式:

可以看到,蓝色部分的两行合并了。
?绿色部分添加和横向总想的求和

求实现方法或者思路,如果能直接在数据库中使用存储过程完成也可以。

谢谢
------解决思路----------------------
引用:
感觉可以在上面代码前先合并?

完全可以在'SELECT * FROM tPo2 PIVOT (SUM(GRQty2) FOR delDate IN ([email protected]+')) a WHERE vendor = '+ '50002903'这句sql外面再套一层用于合并的group by
------解决思路----------------------
存储过程里用查询拼接字符串的方法,既然你能查出后面不固定列,加group by 应该也不是难事吧?也可以处理Datatable,我做过类似的问题,前面固定的列你可以作为分组依据嘛,可以用linq,也可以用DataTble.ToTable。然后创建另外一个相同架构Datable,即用Clone(),每一组,循环将分组键值及非固定列的值插入去
------解决思路----------------------
http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
注意看行转列的第5个例子和之后的如何分组
------解决思路----------------------
大概写了下
结构
class Key
{
public string vendor;
public string purchDoc;
public string material;
public string shoText;

public override int GetHashCode()
{
unchecked
{
return
((vendor.GetHashCode() * 33 +
purchDoc.GetHashCode()) * 33 +
material.GetHashCode()) * 33 +
shoText.GetHashCode();
}
}

public override bool Equals(object obj)
{
Key other = obj as Key;
return other != null &&
other.vendor == this.vendor &&
other.purchDoc == this.purchDoc &&
other.material == this.material &&
other.shoText == this.shoText;
}
}

class Value
{
public Dictionary<string, string> data;
}

Dictionary<Key, Value> table; //hashtable

转换过程
DataTable dt; //要操作的数据表

//合并过程
foreach (DataRow row in dt.Rows)
{
Key key = new Key
{
vendor = (string)row["vendor"],
purchDoc = (string)row["purchDoc"],
material = (string)row["material"],
shoText = (string)row["shoText"],
};

Value value;

//查找
if(!table.TryGetValue(key, out value))
{
value = new Value();
table.Add(key, value);
}

//合并value, 5是日期开始的列号
for (int col = 5; col < dt.Columns.Count; ++col)
{
if (!value.data.ContainsKey(dt.Columns[col].ColumnName) && row[col] != null)
value.data.Add(dt.Columns[col].ColumnName, (string)row[col]);
}
}

//写入合并后的数据
//这边可以直接写sql
foreach (var item in table)
{
DataRow newrow = dt.NewRow();
newrow["vender"] = item.Key.vendor;
//...........
foreach (var item2 in item.Value.data)
{
newrow[item2.Key] = item2.Value;
}
dt.Rows.Add(newrow);
}
  相关解决方案