0

多くの列、特にコードを含む列のセットを持つSQLテーブルがあります。各コード列には、各コード列に関連する対応する情報列もあります。1つのレコードを複数の返されたレコード(つまり、コードごとに1つのレコード)に変換できる必要があります。これは、ソフトウェアコードとともにレガシーデータを含む古いテーブルであり、テーブルを正規化することは非常に困難です(実際に必要な場合でも)。

表は次のとおりです。

CO_ComapnyInformation
                (
                 ProjectID
                ,SubContractor_OrgID
                ,BudGet
                ,ContractDays
                ,ContractCode
                ,ContractCode1
                ,ContractCode2
                ,ContractCode3
                ,ContractCode4
                ,ContractCode5
                ,ContractCodeAmt
                ,ContractCode1Amt
                ,ContractCode2Amt
                ,ContractCode3Amt
                ,ContractCode4Amt
                ,ContractCode5Amt
                ,ContractStartDate
                ,ContractCodeBudget
                ,ContractCodeBudget1
                ,ContractCodeBudget2
                ,ContractCodeBudget3
                ,ContractCodeBudget4
                ,ContractCodeBudget5
                ,ContractCodeAdjust
                ,ContractCodeAdjust1
                ,ContractCodeAdjust2
                ,ContractCodeAdjust3
                ,ContractCodeAdjust4
                ,ContractCodeAdjust5
                ,ContractCodeUncommit
                ,ContractCodeUncommit1
                ,ContractCodeUncommit2
                ,ContractCodeUncommit3
                ,ContractCodeUncommit4
                ,ContractCodeUncommit5
                ,ContractCodeSaveOR
                ,ContractCodeSaveOR1
                ,ContractCodeSaveOR2
                ,ContractCodeSaveOR3
                ,ContractCodeSaveOR4
                ,ContractCodeSaveOR5
                )

基本的に、返されるレコードセットは次のようになります。

Contract Code | Contract Budget | Contract Adjust | Contract Uncommit | Contract SaveOR | Pro_ID | ...
ContractCode    10.00             xxxx
ContractCode1
ContractCode2

等...

COntractCode列にデータがある場合のみ。

どうすればよいですか?

4

2 に答える 2

3

あなたはそれをするために使うことができますunion all

select 'ContractCode' as ContractCodeType, ContractCode, ContractCodeBudget, ...
from CO_ComapnyInformation

union all

select 'ContractCode1' as ContractCodeType, ContractCode1, ContractCodeBudget1, ...
from CO_ComapnyInformation

...

最初の列()は必要ないかもしれませんがContractCodeType、それは、行がどの値のセットから来たのかを知るためだけのものです。

ただし、理想的には、これらのフィールドに同じタイプの情報が格納されている場合は、1セットのフィールドのみを含む単純なテーブルを作成することをお勧めします。その上にあるビュー(基本的にはunion上記のコード)から始めて、小さなステップでアプリケーションをリファクタリングすることができます。

于 2012-10-24T16:21:30.910 に答える
1

SQLServerのピボット/ピボット解除機能(次のようなもの)を利用することで、ベーステーブルから1回選択するだけでこれを実行できるはずです。

select ProjectID, 
       Contract_Code, 
       max(Budget) Budget, 
       max(Adjust) Adjust, 
       max(Uncommit) Uncommit, 
       max(SaveOR) SaveOR
from
(select ProjectID, vals, left(cols,1,13) Contract_Code, right(cols,len(cols)-13) col_head from
 (select ProjectID,
         ContractCodeBudget  ContractCode_Budget,
         ContractCodeBudget1 ContractCode1Budget,
         ContractCodeBudget2 ContractCode2Budget,
         ContractCodeBudget3 ContractCode3Budget,
         ContractCodeBudget4 ContractCode4Budget,
         ContractCodeBudget5 ContractCode5Budget,
         ContractCodeAdjust  ContractCode_Adjust,
         ContractCodeAdjust1 ContractCode1Adjust,
         ContractCodeAdjust2 ContractCode2Adjust,
         ContractCodeAdjust3 ContractCode3Adjust,
         ContractCodeAdjust4 ContractCode4Adjust,
         ContractCodeAdjust5 ContractCode5Adjust,
         ContractCodeUncommit  ContractCode_Uncommit,
         ContractCodeUncommit1 ContractCode1Uncommit,
         ContractCodeUncommit2 ContractCode2Uncommit,
         ContractCodeUncommit3 ContractCode3Uncommit,
         ContractCodeUncommit4 ContractCode4Uncommit,
         ContractCodeUncommit5 ContractCode5Uncommit,
         ContractCodeSaveOR  ContractCode_SaveOR,
         ContractCodeSaveOR1 ContractCode1SaveOR,
         ContractCodeSaveOR2 ContractCode2SaveOR,
         ContractCodeSaveOR3 ContractCode3SaveOR,
         ContractCodeSaveOR4 ContractCode4SaveOR,
         ContractCodeSaveOR5 ContractCode5SaveOR
  from CO_ComapnyInformation) t
 unpivot (vals for cols in (ContractCode_Budget,ContractCode1Budget,ContractCode2Budget,ContractCode3Budget,ContractCode4Budget,ContractCode5Budget,
                            ContractCode_Adjust,ContractCode1Adjust,ContractCode2Adjust,ContractCode3Adjust,ContractCode4Adjust,ContractCode5Adjust,
                            ContractCode_Uncommit,ContractCode1Uncommit,ContractCode2Uncommit,ContractCode3Uncommit,ContractCode4Uncommit,ContractCode5Uncommit,
                            ContractCode_SaveOR,ContractCode1SaveOR,ContractCode2SaveOR,ContractCode3SaveOR,ContractCode4SaveOR,ContractCode5SaveOR
                            )
          ) as t1
) as t2
pivot (max(vals) for col_head in ([Budget],[Adjust],[Uncommit],[SaveOR])) as t3
group by ProjectID, Contract_Code
于 2012-10-24T17:37:17.903 に答える