如何使用查询将单个列中的值移动到单个字段中

时间:2017-06-01 15:28:05

标签: sql sql-server vb.net

我目前有一个信息表,看起来像这样:

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列,而且我没有太多运气。任何可以提供帮助的人都将很高兴。提前致谢

3 个答案:

答案 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的单一来源值。如果您有feeacctsyear,那么我会使用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,那么你应该没问题。