我想与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中完成吗?
我想与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中完成吗?
这只能在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
结果:
Name Code Qty Code Qty Code Qty
----- ---- ----------- ---- ----------- ---- -----------
data1 AG 12 AS 15 AQ 17
data2 MS 10 IS 11 NULL NULL
不完全。不过,您可以尝试将大量代码,数量对连接成每个记录的单个值。我不确定你打算如何处理多个同名的列,即使这样的事情是可能的。
有没有可以做到这一点的asp代码? – JohnDoe4136 2011-12-29 09:21:28
这是另一个问题:) - 但通常情况下,您仍然需要解决具有多个具有相同名称的列和动态数量的列的问题。 – sq33G 2011-12-29 09:27:30
假设使用的是SQLServer的,可以使用秩到顺序号分配给具有名称组的各代码,例如:
select Name, Code, Qty, Rank() OVER (PARTITION BY Name ORDER BY Code) AS CodeRank
from MyTable
然后,你可以SQLServer的或SSRS到内使用枢轴功能按要求格式化。
你会怎么做,如果有下一样'Name'三个记录? – sq33G 2011-12-29 08:44:24
同样的事情,除了会有三个不同的代码而不是两个等等。 – JohnDoe4136 2011-12-29 08:56:18
你是否试图列出水平不同的行按组?如果data1具有7-8个不同的行并且data2具有1-2个记录,则提供场景。 – 2011-12-29 09:35:25