【问题标题】:Dynamically add column values in SQL Server在 SQL Server 中动态添加列值
【发布时间】:2013-10-21 21:29:29
【问题描述】:

我在表中有以下数据。

状态 P_Name 产品 Apr-2013 May-2013 Jun-2013 July-2013 Aug-2013 Sep-2013 Oct-2013 Nov-2013 Dec-2013 Jan-2014 Feb-2014 Mar-2014 ==================================================== ==================================================== ==================================================== ========= s1 p1 pro1 1500 4587 5245 6541 9683 45878 65464 4444 4411 21452 223322 232322 s1 p1 pro2 1500 4587 5245 6541 9683 45878 65464 4444 4411 21452 223322 232322

现在前三列是静态的,但值是动态的,其余的 column_names 和值是动态的。有了这个有一个变量

Declare @MONTHS INT
SET @MONTHS = 1--3/6/12 can be 1/3/6/12 as monthly/quater/half-year/fullyear

现在根据@MONTHS 的值,我必须将值添加到第一/第一到第三/第一到六/第一到十二列并仅显示该列。 如果

SET @MONTHS = 1

那么上面的数据就是结果。但是

SET @MONTHS = 3

那么想要的结果如下:

状态 P_Name 产品 Jun-2013 Sep-2013 Dec-2013 Mar-2014 ==================================================== ====================== s1 p1 pro1 11332 62102 74319 477096 s1 p1 pro2 11332 62102 74319 477096

此处仅显示第 3 个月列,并添加了 2013 年 4 月、2013 年 5 月和 2013 年 6 月的列值(在 2013 年 6 月列中),我希望在第 6 列和第 12 列中也显示 6 和 12。 月列数和行数是动态的。 月份列数只能是 1/3/6/12 的倍数。 在这方面需要帮助。 谢谢。

编辑: 上面的表格数据是在 PIVOT 的帮助下使用另一个表格得出的。是否可以在没有循环的 PIVOT 之前/使用 ..? 以下是 PIVOT 之前的数据。

state p_name 产品数量monthnames ================================================= s1 p1 pro1 1500 2013 年 4 月 s1 p1 pro1 4587 2013 年 5 月 s1 p1 pro1 5245 2013 年 6 月 等等................ ………………………………………………………………………………

【问题讨论】:

  • 向我们展示你已经拥有的东西。
  • 对此一无所知...:(抱歉一段时间后编辑了重要信息....!!
  • 这里的网站规则之一:“要求代码的问题必须证明对正在解决的问题有最低限度的了解。包括尝试的解决方案、它们为什么不起作用以及预期的结果。 " 所以至少向我们展示你对静态部分的了解。那么什么时候可以把它改成动态的。

标签: sql-server


【解决方案1】:

认为这样就可以了。为派生列添加列名可能有点棘手,但我认为这是可能的。如果列数不是@month 的倍数,还需要一些异常处理。我打电话给我的桌子States

declare @month int
set @month = 3

declare cur cursor for 
select name
  from syscolumns
 where object_name(id) = 'States'
   and colorder > 3
 order by colorder

declare @count int, @col varchar(100), @sql varchar(max), @tmp varchar(max)

set @count = 1
set @sql = 'select State, P_Name, Product, 0'
set @tmp = ''

open cur
fetch cur into @col
while @@FETCH_STATUS = 0 begin
    set @tmp = @tmp + '+' + @col
    if @count = @month begin
        set @sql = @sql + @tmp + ', 0'
        set @tmp = ''
        set @count = 0
    end

    set @count = @count + 1

    fetch cur into @col
end

set @sql = substring(@sql, 1, len(@sql) - 3) + ' from States'

exec(@sql)

close cur
deallocate cur

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    相关资源
    最近更新 更多