【问题标题】:Rearrange DB query result in array for duplicate rows重新排列重复行的数组中的数据库查询结果
【发布时间】:2019-08-29 22:34:51
【问题描述】:

我想将带有重复数据的 db 查询结果重新排列到不同的行中(用于数据显示),但是如果找到超过 1 个项目,则有 1 列以逗号分隔收集相关值。

例如考虑下面的列表(来自数据库查询):

ID  GROUP   DATE
A1212   1   1/1/2019
A1212   2   1/1/2019
A1313   1   3/1/2019

进入:

ID  GROUP
A1212   1,2
A1313   1

sql 字符串:

select DISTINCT Declaration_Form_Master.*,Declaration_Form_Detail.KPA_Group, Temp_Storage_Reg_V.*,Temp_Storage_Reg_V.ID as TSEID,Users.Company As Uc, 'NULL' as 'CTU_id' from Declaration_Form_Master left outer join Temp_Storage_Reg_V on (Declaration_Form_Master.Master_ID=Temp_Storage_Reg_V.TSEMaster_ID) right join Users on (Declaration_Form_Master.Agent_ID = Users.UserId) right join Declaration_Form_Detail on (Declaration_Form_Master.Master_ID = Declaration_Form_Detail.Master_ID) where Declaration_Form_Master.Confirmation ='1' and Submit_Date >= '2019-01-28' and Submit_Date < '2019-08-30' order by Application_ID DESC

需要加入所有表,因为搜索条件基于多个表上的列。我无法弄清楚 sql,但想使用数组或列表重新排列结果。

也许一些算法可以提供帮助。

【问题讨论】:

  • 向我们展示您的 c# 代码及其外观。你是如何获取这些数据的?您是在使用 Linq 还是在强制执行此操作?
  • 如果您使用的是 linq:尝试按 id 对数据进行分组,然后将 grp.Key 输出到第一列,将 string.Join 所有分组值输出到第二列
  • 您必须向我们展示您的 c# 代码,或者如果您想在 SQL 中执行此操作,请向我们展示您的尝试。
  • 我使用的是传统的海量 ORM。我知道 LINQ 可以做到这一点。只需更新我的问题以包含代码中的 sql。

标签: c# arrays


【解决方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(string));
            dt.Columns.Add("GROUP", typeof(int));
            dt.Columns.Add("DATE", typeof(DateTime));

            dt.Rows.Add(new object[] {"A1212", 1, DateTime.Parse("1/1/2019")});
            dt.Rows.Add(new object[] {"A1212", 2, DateTime.Parse("1/1/2019")});
            dt.Rows.Add(new object[] {"A1213", 1, DateTime.Parse("3/1/2019")});


            DataTable dt2 = new DataTable();
            dt2.Columns.Add("ID", typeof(string));
            dt2.Columns.Add("GROUP", typeof(string));

            var groups = dt.AsEnumerable().GroupBy(x => x.Field<string>("ID")).ToList();

            foreach (var group in groups)
            {
                dt2.Rows.Add(new object[] {
                    group.Key,
                    string.Join(",", group.Select(x => x.Field<int>("GROUP").ToString()).Distinct())
                });
            }

        }
    }

}

【讨论】:

  • 好的,试试这个。需要将查询结果传递给数据表 1st。
  • 您的查询应该已经返回了一个行列表,相当于 dt.AsEnumerable()
  • var group = data.GroupBy.Field("Application_ID").ToList();异常详细信息:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:“object”不包含“GroupBy”的定义
  • DataTable dt = query.CopyToDataTable();
【解决方案2】:

如果您想在 T-SQL 中执行此操作,则必须汇总结果 举例

DECLARE @fakeTable TABLE (ID varchar(50), [GROUP] int)

INSERT INTO @fakeTable 
VALUES
('A1212',   1 ),
('A1212',   2 ),
('A1213',   1 )

SELECT
    ID,
    [GROUP] = stuff((
        SELECT ','+convert(varchar(100),[GROUP])
        FROM @fakeTable innerTable
        WHERE innerTable.ID = orgTable.ID
        ORDER BY [GROUP]
        for xml path (''), type).value('.','nvarchar(max)')

      ,1,1,'')
FROM (
SELECT DISTINCT ID FROM @fakeTable
) orgTable

More info about aggregation

【讨论】:

    【解决方案3】:
    DataTable dx = new DataTable();
        dx.Columns.Add("Application_ID", typeof(int));
        dx.Columns.Add("KPA_Group", typeof(int));
    
        foreach(var z in data) { 
        dx.Rows.Add(new object[] { z.Application_ID,z.KPA_Group });
        }
    
        DataTable dt1 = new DataTable();
        dt1.Columns.Add("Application_ID", typeof(string));
        dt1.Columns.Add("KPA_Group", typeof(string));
    
        var groups = dx.AsEnumerable().GroupBy(x => x.Field<Int32>("Application_ID")).ToList();
    
    
        foreach (var group in groups)
        {
            dt1.Rows.Add(new object[] {
                        group.Key,
                        string.Join(",", group.Select(x => x.Field<int>("KPA_Group").ToString()).Distinct())
                    });
        }
    
    
        foreach (DataRow row in dt1.Rows)
        {
    
            @:@row["Application_ID"].ToString() | 
            @:@row["KPA_Group"] <br />
        }
    
    

    结果:

    2019080001 | 2,3 
    2019070002 | 2 
    2019070001 | 2 
    2019060001 | 1,2 
    2019040002 | 2 
    2019030002 | 2 
    2019030001 | 2 
    2019020002 | 2 
    2019020001 | 2 
    

    我不明白为什么我不能使用 CopyToDataTable 方法。通过使用 foreach 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多