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