Sql Server:任何相当于Excel的Hlookup?

时间:2012-11-17 06:20:07

标签: sql sql-server excel reference

我试图找到这个问题的答案,但这很难,因为我真的不知道该写什么。我已经尝试过“对列进行顺序引用”,“索引列”,当然还有“等同于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  

2 个答案:

答案 0 :(得分: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样式表中,但我不会推荐它。

答案 1 :(得分: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

然而,这不是一个好的解决方案。重构表模式是真正的优势。