Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
SQL将具有相同值的记录分组,并将其放入表中_Sql_Sql Server - Fatal编程技术网

SQL将具有相同值的记录分组,并将其放入表中

SQL将具有相同值的记录分组,并将其放入表中,sql,sql-server,Sql,Sql Server,我想用SQL对同一条记录进行分组,下面是我的结果 Name Code Qty data1 AG 12 data1 AS 15 data2 MS 10 data2 IS 11 我希望它变成这样 Name Code Qty Code Qty data1 AG 12 AS 15 data2 MS 10 IS 11 这只能在SQL中完成吗?不完全可以。不过,您可以尝试将大量代码、数量对连接到每条记录的单个值中。我不确定您打算如何处

我想用SQL对同一条记录进行分组,下面是我的结果

Name  Code   Qty
data1  AG   12
data1  AS   15
data2  MS   10
data2  IS   11
我希望它变成这样

Name  Code   Qty Code  Qty
data1  AG    12   AS   15
data2  MS    10   IS   11

这只能在SQL中完成吗?

不完全可以。不过,您可以尝试将大量代码、数量对连接到每条记录的单个值中。我不确定您打算如何处理多个同名列,即使这样做是可能的。

不完全是这样。不过,您可以尝试将大量代码、数量对连接到每条记录的单个值中。我不确定您打算如何处理多个同名列,即使这样做是可能的。

假设您使用的是SQLServer,您可以使用rank为名称组中的每个代码分配一个序列号,如下所示:

select Name, Code, Qty, Rank() OVER (PARTITION BY Name ORDER BY Code) AS CodeRank
from MyTable

然后,您可以使用SQLServer或SSRS中的pivot功能,根据需要对其进行格式化

假设您使用的是SQLServer,您可以使用rank为具有名称组的每个代码分配一个序列号,如下所示:

select Name, Code, Qty, Rank() OVER (PARTITION BY Name ORDER BY Code) AS CodeRank
from MyTable
然后,您可以使用SQLServer或SSRS中的pivot功能,根据需要对其进行格式化

这只能在SQL中完成吗

如果列数可变,则必须动态地构建查询。 我很难称之为“仅SQL”,但它可以在T-SQL中完成,这里有一种方法

-- Sample table
declare @T table
(
  Name varchar(5),
  Code varchar(2),
  Qty int
)

-- Sample data
insert into @T values
('data1',  'AG',   12),
('data1',  'AS',   15),
('data1',  'AQ',   17),
('data2',  'MS',   10),
('data2',  'IS',   11)

declare @XML xml
declare @SQL nvarchar(max)
declare @Max int

-- Max number of codes per name
select @Max = max(C)
from (select count(*) as C
      from @T
      group by Name) as T

-- Convert table to XML
set @XML = (select Name,
                   (select Code,
                           Qty
                    from @T as T2
                    where T1.Name = T2.Name
                    for xml path('c'), type)
            from @T as T1
            group by Name
            for xml path('r'))

-- Build a dynamic query
;with Numbers(Number) as 
(
  select 1
  union all
  select Number + 1
  from Numbers
  where Number < @Max
)
select @SQL = 'select T.N.value(''Name[1]'', ''varchar(5)'') as Name ' +
               (select ',T.N.value(''c['+cast(Number as nvarchar(10))+']/Code[1]'', ''char(2)'') as Code
                        ,T.N.value(''c['+cast(Number as nvarchar(10))+']/Qty[1]'', ''int'') as Qty'
                from Numbers
                for xml path(''), type).value('.', 'nvarchar(max)') +
              ' from @xml.nodes(''/r'') as T(N)'

-- Execute query
exec sp_executesql @SQL, N'@xml xml', @XML
试试这里:

这只能在SQL中完成吗

如果列数可变,则必须动态地构建查询。 我很难称之为“仅SQL”,但它可以在T-SQL中完成,这里有一种方法

-- Sample table
declare @T table
(
  Name varchar(5),
  Code varchar(2),
  Qty int
)

-- Sample data
insert into @T values
('data1',  'AG',   12),
('data1',  'AS',   15),
('data1',  'AQ',   17),
('data2',  'MS',   10),
('data2',  'IS',   11)

declare @XML xml
declare @SQL nvarchar(max)
declare @Max int

-- Max number of codes per name
select @Max = max(C)
from (select count(*) as C
      from @T
      group by Name) as T

-- Convert table to XML
set @XML = (select Name,
                   (select Code,
                           Qty
                    from @T as T2
                    where T1.Name = T2.Name
                    for xml path('c'), type)
            from @T as T1
            group by Name
            for xml path('r'))

-- Build a dynamic query
;with Numbers(Number) as 
(
  select 1
  union all
  select Number + 1
  from Numbers
  where Number < @Max
)
select @SQL = 'select T.N.value(''Name[1]'', ''varchar(5)'') as Name ' +
               (select ',T.N.value(''c['+cast(Number as nvarchar(10))+']/Code[1]'', ''char(2)'') as Code
                        ,T.N.value(''c['+cast(Number as nvarchar(10))+']/Qty[1]'', ''int'') as Qty'
                from Numbers
                for xml path(''), type).value('.', 'nvarchar(max)') +
              ' from @xml.nodes(''/r'') as T(N)'

-- Execute query
exec sp_executesql @SQL, N'@xml xml', @XML

请尝试此处:

如果在同一
名称下有三条记录,您会怎么做?
?相同的事情,只是会有三个不同的代码,而不是两个,依此类推。您是否尝试按分组水平列出不同的行?如果data1有7-8个不同的行,data2有1-2个记录,请给出一个场景。@johnoE4136:您使用的是SQLServer吗?是,我使用的是SQLServer,如果在同一个
名称下有三条记录,您会怎么做?相同的事情,只是会有三条不同的代码,而不是两条,以此类推。您是否尝试按组列出水平不同的行?如果data1有7-8个不同的行,data2有1-2个记录,请给出一个场景。@JohnoE4136:您使用的是SQLServer吗?是的,我使用的是SQLServer,这是另一个问题:)-但一般来说,您仍然需要解决具有相同名称的多个列以及动态列数的问题。这是另一个问题:)-但一般来说,您仍然需要解决具有相同名称的多个列以及动态列数的问题。