我试图找到这个问题的答案,但这很难,因为我真的不知道该写什么。我已经尝试过“对列进行顺序引用”,“索引列”,当然还有“等同于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
答案 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
然而,这不是一个好的解决方案。重构表模式是真正的优势。