2016-09-12 14 views
2

私はここで完全に困惑しており、助けが必要です。1つ前の選択の後に特定のCOLUMNSを選択するROW

私は "2016Blocks"というテーブルを持っています。このテーブルには、各個人の行があります。各行には毎年の列があります(各行に365列)。

私は現在、このようになります単一の行が返されますselect文があります。

SELECT * FROM [2016Blocks] WHERE ([OfficialID] = @OfficialID) 

上記のselect文は、365列を持つ1行が返されます。各列は空白であるか、日付が入っています。列の名前は(Blocks1、Blocks2、Blocks3 ...... Blocks365)

この行に別のselect文を実行して、日付がある列のみを返すようにしたいとします。

どうすればよいですか?

+1

何もない動的SQL – Lamak

答えて

0

これにはUNPIVOT関数を使用する必要があります。 365個の列があるので、365個のハードコードされた列名は言及したくないかもしれません。この目的のために、動的クエリを使用することができます。最後に、サブクエリで以下のクエリを使用するか、tempテーブルにレコードを挿入し、BlockValueのフィルタを追加できます。お役に立てれば。

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @colsUnpivot 
    = stuff((select ','+quotename(C.column_name) 
      from information_schema.columns as C 
      where C.table_name = '2016Blocks' and 
       C.column_name like 'Blocks%' 
      for xml path('')), 1, 1, '') 

set @query 
    = 'select id, entityId, 
     BlockNumber, 
     BlockValue 
    from 2016Blocks 
    WHERE ([OfficialID] = @OfficialID) 
    unpivot 
    (
     BlockValue 
     for BlockNumber in ('+ @colsunpivot +') 
    ) u' 

exec sp_executesql @query; 
0

これはXMLで行うことができます。ヌルが解消され、すべての365のフィールドに

Declare @2016Blocks table (OfficialID int ,Block1 Date,Block2 Date,Block365 Date) 
Insert into @2016Blocks values 
(1,'2016-01-01','2016-01-02',null), 
(2,'2016-06-15','2016-07-02','2016-08-22') 

Declare @XML xml 
Set @XML = (Select * from @2016Blocks for XML RAW) 

Select ID = r.value('@OfficialID','int') 
     ,Item = attr.value('local-name(.)','varchar(100)') 
     ,Value = attr.value('.','varchar(max)') 
From @XML.nodes('/row') as A(r) 
Cross Apply A.r.nodes('./@*[local-name(.)!="OfficialID"]') as B(attr) 

戻り

ID Item  Value 
1 Block1  2016-01-01 
1 Block2  2016-01-02 
2 Block1  2016-06-15 
2 Block2  2016-07-02 
2 Block365 2016-08-22 

EDIT

**

を指定する必要私はIDが含まれておらず、機能を示すフィールド名* *

関連する問題