0

我试图找到这个问题的答案,但这非常困难,因为我真的不知道我想写什么。我已经尝试过“对列的顺序引用”、“索引列”,当然还有“等价的” HLookup,但似乎没有任何效果。

无论如何,我的问题来了:

我在 Excel 中有一个表,在第 1 列中有一个条目(标识唯一键),有 1700 个不同的值(行)。这些行中的每一行都有大约 100 列(对应于该键)。

我需要一个过程来按顺序扫描此表并将 ID 条目(在第一列中)匹配到每列中的条目并返回相应单元格中的值。

它会是这样的:

For row=1 to N do
    For column = 1 to N do
        Result <- cell[i,j]
    End for
End for

我的问题是如何扫描列,因为我不知道如何使用一些索引来引用列?

如果这真的不可能,你知道我还能如何解决这个问题吗?例如,复制分布在列中的所有值并“转置”它们,使它们成为一个列,以某种方式在另一列上重复 ID_Key 的多个副本?

谢谢您的帮助!

Excel数据:

ID      Date0   DateF   Jun-26  Jun-27  Jun-28  Jun-29  Jun-30  
---------------------------------------------------------------
10006   1926    1953    67.743  71.245  70.139  70.139  70.139  
10014   1926    1961    13.005  12.787  12.63   13.871  14.896  
10022   1926    1960    13.567  13.996  14.326  14.552  14.025  
10030   1926    1966    15.924  17.487  18.771  20.508  20.488  
10049   1926    1932    11.984  12.848  13.34   59.145  61.094  
10057   1926    1968    8.234   8.376   8.448   7.577   8.966  
10065   1926    1929    16.609  15.727  13.849  18.062  -99.99  
10073   1926    1938    14.789  14.912  14.571  15.321  14.926  
10081   1926    1930    1.769   1.83    1.881   1.731   1.703  
10102   1926    1953    14.474  16.604  19.184  21.49   27.895  
4

2 回答 2

1

您需要做的第一件事是将这些数据转换为类似于数据库表的东西。我建议你用UNPIVOT这样做。

因此,您的部分查询将类似于:

SELECT ID,Date0,DateF,PDate,Value
FROM Table t
  UNPIVOT (Value FOR PDate IN ([Jun-26],[Jun-27],[Jun-28],[Jun-29],[Jun-30])) AS up

这会给你一些看起来像这样的行:

ID      Date0   DateF   PDate    Value
10006   1926    1953    Jun-26   67.743
10006   1926    1953    Jun-27   71.245
10006   1926    1953    Jun-28   70.139
10006   1926    1953    Jun-29   70.139
10006   1926    1953    Jun-30   70.139
10014   1926    1961    Jun-26   13.005

您可以将其放在子查询或 CTE 中。现在,您可以构建一条合理的 SQL,因为您不再有包含相同类型数据的重复列。

如果需要,您可以PIVOT在最后再次将其转回此 Excel 样式表,但我不建议这样做。

于 2012-11-17T11:23:09.587 回答
0

简单的答案是:不,您不能遍历表的列。

但是您可以使用简单的查询获取每列的列信息(名称、类型、大小等),然后构造一个表示查询的字符串

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('dbo.yourTableName') 

这是一个针对特定类型的所有列创建查询的函数。它接受 3 个参数:表名、一些常量值和数据类型('float' 或 'int')用法:

select dbo.BuildNumericQuery('MyTable','123','float')

它将创建一个看起来像的字符串

'select * from MyTable where Field1=123 or Field2=123 or .... '

这里的代码(tadaaa):

create function BuildNumericQuery 
(
  @table varchar(80), 
  @value varchar(10), 
  @datatype varchar(10) 
)
returns varchar(1000)
as
begin
  declare @column varchar(80), @query varchar(1000)
  declare x cursor for
    SELECT name FROM sys.columns 
      WHERE object_id = OBJECT_ID(@table) and (1=
         case when @datatype = 'int' 
               and system_type_id in (48,52,56,127) then 1
              when @datatype = 'float' 
               and system_type_id in (60,62,106,108,122) then 1 
              else 0 end)
  open x
  fetch next from x into @column
  while @@FETCH_STATUS=0 begin
    set @query= case 
      when @query is null then '' 
      else @query+' or ' 
      end + @column+' = '+ @value
    fetch next from x into @column
  end
  close x
  deallocate x
  set @query='select * from ' + @table + 
    case when @query is null then '' else 'where '+@query     
    end
  return @query
end

但是,这不是好的解决方案。重构表模式是真正的交易。

于 2012-11-17T07:22:07.577 回答