【问题标题】:How do I move values from a single column into individual fields with a query如何使用查询将值从单个列移动到单个字段中
【发布时间】:2017-06-01 15:28:05
【问题描述】:

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

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 列,但我运气不佳。任何可以提供帮助的人都将不胜感激。提前致谢

【问题讨论】:

  • 到目前为止您尝试过什么?你查到PIVOT了吗?
  • Pivot 就是答案。我只是在语法上有问题,但我现在似乎已经解决了。非常感谢。

标签: sql sql-server vb.net


【解决方案1】:

简单的pivot会得到如下结果:

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

【讨论】:

  • 打败我!!
【解决方案2】:

使用条件聚合来透视您的数据:

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 的单一来源值。如果每个acctsyear 有多个fee,那么我会使用sum()

【讨论】:

    【解决方案3】:

    只是为了扩展 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 应该没问题。

    【讨论】:

    • 也谢谢你。我会记下为此使用存储过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多