2017-01-04 3 views
0

の日付を作成します。私は、次のしているSQL Serverの

select distinct 
    loannumber, activedt, inactivedt 
from 
    smd..TABLE_NAME 
where 
    loannumber = '12345678' 

を私はactivedtinactivedt間のすべての月/日の値を含む列を作成できるようにしたいです。私は日付が変数として設定されているアイデアを見てきましたが、この場合、日付は各レコードのテーブルから来ています。助けてください。ありがとう。

+2

サンプルデータと望ましい結果によって、前提が小さくなります。 –

+1

列には複数の値を入れないでください。あなたが本当に望んでいると思うのは、activedtとinactivedtの間の毎日の行ですか?カレンダーテーブルが役立つかもしれませんが、単にその日が必要な場合は、集計表を使用する方がよいでしょう。 –

答えて

0

この記事では、Date Tablesを使用することをお勧めします。詳細な説明がありますが、このようなシナリオで使用することができます。この表では

https://www.mssqltips.com/sqlservertip/4054/creating-a-date-dimension-or-calendar-table-in-sql-server/

、あなたは、テーブル間の結合や日付列を使用して行うことができます。

+0

ありがとうございます。しかし、その状況は私にとっては複雑すぎる。 InactiveDtがNULLの場合はクエリを停止し、InactiveDtがNULLの場合はクエリを停止し、InactiveDtが値を持つ場合は各行のInactiveDtを通過させる方法を学びたいと思います。 – user2811136

1

これにより、月単位で増加します。あなたがDAYたい場合は、ちょうど私たちは、master..spt_valuesでアドホック集計表を作成しているが、適切なサイズの任意のテーブルが

Declare @YourTable table (loannumber varchar(25),activedt date,inactivedt date) 
Insert Into @YourTable values 
('12345678','2016-01-01','2017-12-31') 

Select A.LoanNumber 
     ,B.Date 
From @YourTable A 
Cross Apply (
     Select Top (DateDiff(MM,A.activedt,A.inactivedt)+1) Date=DateAdd(MM,Row_Number() Over (Order By (Select null))-1,A.activedt) 
     From master..spt_values 
     ) B 

戻りを行います

を適用CROSS内DDにMMを変更

LoanNumber Date 
12345678 2016-01-01 
12345678 2016-02-01 
12345678 2016-03-01 
12345678 2016-04-01 
12345678 2016-05-01 
12345678 2016-06-01 
12345678 2016-07-01 
12345678 2016-08-01 
12345678 2016-09-01 
12345678 2016-10-01 
12345678 2016-11-01 
12345678 2016-12-01 
12345678 2017-01-01 
12345678 2017-02-01 
12345678 2017-03-01 
12345678 2017-04-01 
12345678 2017-05-01 
12345678 2017-06-01 
12345678 2017-07-01 
12345678 2017-08-01 
12345678 2017-09-01 
12345678 2017-10-01 
12345678 2017-11-01 
12345678 2017-12-01 
0

あなたは物理的な日付テーブルのパフォーマンスを打つが、あなただけの非アクティブとアクティブの日付の間で約2000日未満を持っているとあれば、基本的なクエリは、アドホックそれに反対し、反対CROSS APPLYを考慮する必要はありませんspt_valu esテーブル。

アクティブおよび非アクティブな日数どこ常にオンまたは(非アクティブ< =アクティブで>アクティブ、非アクティブ、および他の人といくつかのケース)の前にあれば、これはいずれの場合のために働く必要があるかどうかはわからなかったので:

select distinct 
    loannumber, activedt, inactivedt, dtvalue 
from 
    smd..TABLE_NAME 
    CROSS APPLY (
     SELECT DATEADD(DD, N.number, activedt) FROM spt_values N 
      WHERE N.number BETWEEN 0 AND DATEDIFF(DD, activedt, inactivedt) AND activedt <= inactivedt 
     UNION ALL SELECT DATEADD(DD, N.number, inactivedt) FROM spt_values N 
      WHERE N.number BETWEEN 0 AND DATEDIFF(DD, inactivedt, activedt) AND activedt > inactivedt 
    ) N (dtvalue) 
where 
    loannumber = '12345678' 

これは1/5に1/3から単一のレコードローンの数については、以下の結果をもたらした:あなたが2000を超えて取得する必要がある場合は

loannumber activedt inactivedt dtvalue 
---------- ---------- ---------- ---------- 
12345678 2017-01-03 2017-01-05 2017-01-03 
12345678 2017-01-03 2017-01-05 2017-01-04 
12345678 2017-01-03 2017-01-05 2017-01-05 

、素早く適切な行カウントを生成するUNION ALLへの追加のテクニックがあります。

+0

こんにちは。 g – user2811136

+0

現在の日付を過ぎてMOを作成しないようにMO列を取得するにはどうすればよいですか? YTテーブルを宣言します(日付inactivedtローンはvarchar(25)、activedt日、) INSERT INTO YTが 選択 明確な ローン、 tblONE Aから inactivedt activedt、 IF OBJECT_ID(N'tempdb ..#RR ')はnullではありません。テーブル#RR 選択ローン、 activedt、 inactivedt、 B.B 順 - (master..spt_values 1から、A.activedt) (ヌルを選択))で 以上選択MO = DateAdd関数(MM、ROW_NUMBER()(注文) tableONE AからMO クロスを適用しますloan descで – user2811136

+0

最後の 'WHERE'節に追加することができます。答えの例では、何かが見つからない限り、 'AND dtvalue <= GETDATE()' –

関連する問題