Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据集中合并多行和多列数据_C#_Asp.net_Sql Server_Datatable_Dataset - Fatal编程技术网

C# 在数据集中合并多行和多列数据

C# 在数据集中合并多行和多列数据,c#,asp.net,sql-server,datatable,dataset,C#,Asp.net,Sql Server,Datatable,Dataset,我的数据集如下所示: 其中B1、B2、C1、C2和C3是列名。G1、G2、S1和T1是我的数据集的第一行元素 现在我想将类似的列/行合并到组中。 示例:B1、B2和B3列合并为一组B, 行:G1和G2组合在一起形成一行G。 下面是我需要的O/P数据集 我曾尝试使用字典和数据集循环,但无法获得此O/p 有人能帮我解决这个问题吗。这必须是动态的,这给这个解决方案增加了巨大的复杂性。由于您没有回答版本问题,我没有使用STRING_AGG,但是,如果您使用的是SQL Server 2017+,您可以简化

我的数据集如下所示:

其中B1、B2、C1、C2和C3是列名。G1、G2、S1和T1是我的数据集的第一行元素

现在我想将类似的列/行合并到组中。 示例:B1、B2和B3列合并为一组B, 行:G1和G2组合在一起形成一行G。 下面是我需要的O/P数据集

我曾尝试使用字典和数据集循环,但无法获得此O/p


有人能帮我解决这个问题吗。

这必须是动态的,这给这个解决方案增加了巨大的复杂性。由于您没有回答版本问题,我没有使用STRING_AGG,但是,如果您使用的是SQL Server 2017+,您可以简化查询以使用它

首先,一些样本数据:

创建表dbo.Matrix[Data]char2, B1 tinyint, B2 tinyint, C1锡, C2 tinyint, C3锡 插入dbo.Matrix[数据], B1, B2, C1, C2, C3 值'G1',1,1,2,2,4, 'G2',1,1,1,1,1, ‘S1’、2、1、2、1、1、, ‘T1’,1,3,2,2,3; 去 现在,如果这不是动态的,您可以使用交叉选项卡将数据集中到组中,如下所示:

选择LEFTM.[Data],1作为[Data], SUMCASE V.Col当“B”时,则V.ColVal结束为B, SUMCASE V.Col当“C”时,则V.ColVal结束为C 来自dbo.M矩阵 交叉应用值'B',M.B1, “B”,M.B2, C',M.C1, “C”,M.C2, “C”,M.C3VCol,ColVal 按左M分组。[数据],1; 不幸的是,由于它是动态的,所以我们需要动态SQL。老实说,这不是开始,我不是来支持这个SQL的;理解它、维护它、支持它,以及因为它是动态SQL,所以确保它的安全,都取决于您。我很乐意回答一些关于它如何工作的问题,但对于不太了解SQL的人来说,这是一个陡峭的学习曲线:

声明@SQL nvarcharMAX; 设置@SQL=N'选择LEFTM.[Data],1为[Data],'+NCHAR13+NCHAR10+ 填充选择N','+NCHAR13+NCHAR10+ N'SUMCASE V.Col当N'+quotenaleftc.COLUMN'名称为1,+N'时,则V.ColVal结束为'+quotenaleftc.COLUMN'名称,1 从信息_SCHEMA.C列 其中C.TABLE_SCHEMA=N'dbo' 和C.表_NAME=N‘矩阵’ 和C.COLUMN_NAME!=N“数据”-假设所有其他列都适用 按LEFTC分组。列名称,1 按LEFTC.列名称排序,1 对于XML路径N,键入.value'.',nvarcharMAX',1,3,N+NCHAR13+NCHAR10+ N'来自dbo.矩阵M'+NCHAR13+NCHAR10+ N'交叉应用程序值'+STUFFSELECT','+NCHAR13+NCHAR10+ N'N'+quoteNameFTC.列名称,1,+N',M.+QUOTENAMEC.列名称+N 从信息_SCHEMA.C列 其中C.TABLE_SCHEMA=N'dbo' 和C.表_NAME=N‘矩阵’ 和C.COLUMN_NAME!=N“数据”-假设所有其他列都适用 按C.COLUMN\u NAME排序 对于XML路径N,键入.value'.',nvarcharMAX',1,26,N+N'VCol,ColVal'+NCHAR13+NCHAR10+ N'按左M分组。[数据],1'+NCHAR13+NCHAR10+ N'按LEFTM排序[Data],1;'; PRINT@SQL-你最好的朋友。 EXEC sp_executesql@SQL;
您可以应用以下逻辑从SQL Server获取所需的输出:

create table T_DataSet
(
    Data varchar(50),
    B1 int,
    B2 int,
    C1 int,
    C2 int,
    C3 int
)

INSERT INTO T_DataSet ([Data],B1,B2,C1,C2,C3)
VALUES('G1',1,1,2,2,4),
      ('G2',1,1,1,1,1),
      ('S1',2,1,2,1,1),
      ('T1',1,3,2,2,3);


    
DECLARE @QUERY VARCHAR(MAX)='' 
DECLARE @Columns VARCHAR(MAX)=''


;with tbl_COLUMN_NAME (COLUMN_NAME) AS
(
    select name as COLUMN_NAME from sys.all_columns
    where object_id = (select object_id from sys.tables where name = 'T_DataSet')
    and name <> 'Data'
)

SELECT 
    @Columns = ISNULL(@Columns +',', '') + T.COLUMN_NAME
FROM 
( 
    select 
        COLUMN_NAME = 'SUM(' + 
            (select SUBSTRING( 
                    ( 
                            SELECT '+'+ COLUMN_NAME
                                FROM tbl_COLUMN_NAME
                                where LEFT(COLUMN_NAME,1) = LEFT(inner_C1.COLUMN_NAME,1)
                                FOR XML PATH('') 
             
                    ), 2 , 9999))
             + ') AS ' + LEFT(COLUMN_NAME,1)

    from tbl_COLUMN_NAME as inner_C1
    Group by LEFT(COLUMN_NAME,1)
    
)T


set @QUERY = 'select LEFT([Data],1) as Data ' + @Columns + '
    From T_DataSet
    Group by LEFT([Data],1)';

PRINT @QUERY
EXEC(@QUERY) 

名为B的列数是静态的吗?列数可能随B而变化,如B1、B2、B3和B4。。所以在这些陈述上存在冲突;它们是静态的还是变化的?它们不能两者都是。它们会有所不同。@larnu什么SQL Server版本?