我目前有一个信息表,看起来像这样:
ACCTS | YEAR | FEE
-------------------------
MBR2056 | 2002 | 25.00
MBR2058 | 2002 | 12.00
MBR2060 | 2002 | 15.00
MBR2056 | 2003 | 25.00
MBR2060 | 2003 | 10.00
我试图将信息从第2列中删除(每年作为标题),按“年份”列出“FEE”列中每个值的字段。我正在寻找的东西看起来像这样:
ACCTS | 2002 | 2003
-------------------------
MBR2056 | 25.00 | 25.00
MBR2058 | 12.00 |
MBR2060 | 15.00 | 10.00
我的问题很大一部分是ACCTS列中的数字不是连续的,而是按顺序递增。我可以通过ACCTS字段对查询进行分组,但一次只能收集一年的数据。我真的想将FEES值分解为YEAR列,而且我没有太多运气。任何可以提供帮助的人都将很高兴。提前致谢
答案 0 :(得分:3)
简单的数据透视将获得如下结果:
Select * from YourTable
pivot (sum(Fee) for [Year] in ([2002],[2003])) p
如果该表中有其他列,则
Select * from
(Select Accts, [Year], Fee from YourTable ) a
pivot (sum(Fee) for [Year] in ([2002],[2003])) p
答案 1 :(得分:1)
使用条件聚合来转移数据:
select
ACCTS
, [2002] = max(case when [year] = 2002 then fee end)
, [2003] = max(case when [year] = 2003 then fee end)
from tbl
group by ACCTS
我使用max()
暗示它是fee
的单一来源值。如果您有fee
个accts
和year
,那么我会使用sum()
。
答案 2 :(得分:0)
只是扩展Kannan Kandasamy的回答
如果您愿意,可以动态计算列,可以通过查询然后在VB中构建SQL,也可以直接在查询中构建SQL,我将其实现为存储过程
CREATE PROCEDURE GetFees AS
BEGIN
declare @columns nvarchar(max)
select @columns = coalesce(@columns + ', ', '')+
'['+cast(year as varchar(4))+']'
from (select distinct(year) as year from mytable) x;
set @columns = 'select * from mytable pivot (sum(fee) for year in ('+
@columns + ')) x'
exec dbo.sp_executesql @columns
END
然后,您可以从VB代码中调用存储过程dbo.GetFees来获取数据。
请注意,您必须确定列的内容,因为这可能会导致SQL注入。如果year列是int,那么你应该没问题。