0

私はこの質問の答えを見つけようとしましたが、何を書くべきか本当にわからないので非常に難しいと思います。私はすでに「列への順次参照」、「列のインデックス付け」、そしてもちろん「と同等」を試しましHLookupたが、何も機能しないようです。

とにかく、ここに私の質問があります:

1700の異なる値(行)を持つ列1に1つのエントリ(識別一意キー)があるExcelのテーブルがあります。これらの各行には、約100列(そのキーに対応)があります。

このテーブルを順番にスキャンし、IDエントリ(最初の列)を各列のエントリにマッハして、対応するセルの値を返す手順が必要です。

次のようになります。

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

私の問題は、いくつかのインデックスで列を参照する方法がわからないため、列をスキャンする方法です。

これが本当に不可能な場合、他にどのようにこれを解決できるかについて何か考えがありますか?たとえば、列全体に分散されているすべての値をコピーして「転置」し、それらが1つの列になるようにして、別の列で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') 

これは、特定のタイプのすべての列に対してクエリを作成する関数です。テーブル名、定数値、データ型('float'または'int')の3つのパラメーターを受け入れます。使用法:

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 に答える