2017-03-29 19 views
0

私の名前はThorstenで、SQL Serverは初めてです。今、私は結合を設定した後に問題に直面しています...私は2つのテーブルに参加し、これまでのところ働いていましたが、進める知識が足りません。その上SQL Serverのデータの結合と挿入

| Item | validDate | Price |  
| ---- | --------- | ----- |   
| A | 01.01.2017 | 100 | 
| A | 28.02.2017 | 100 | 
| A | 31.03.2017 | 120 | 

...と:

| Item | validDate | Price | 
| ---- | --------- | ----- | 
| A | 01.01.2017 | 100 | 
| A | 31.03.2017 | 100 | 
| A | 01.04.2017 | 120 | 
| A | 31.07.2017 | 120 | 

は、今私はTABLE1のギャップのためのデータセットを含む表を作成したい:ここ

はTABLE1です。

私の考えは、テーブル1から日付テーブルへの結合を設定することでした。毎月末が含まれていました。しかし、新しいデータセットを作成することによってギャップを挿入する必要があります。どのようなコードでこの問題を解決できるでしょうか?

私が初心者なので、私は自分の問題を説明することができたと思います。

ありがとうございました!クエリ以下を利用するように

+0

カレンダーテーブルを使用する必要があります。これは、毎日(またはあなたのケースでは月末ごとに)行を持つテーブルです。次に、あなたはこのテーブルへの外部結合 –

答えて

0

試してみてください。

DECLARE @Table TABLE (Item VARCHAR(2), validDate DATE, Price INT) 
INSERT INTO @Table VALUES 
('A','2017-01-01',100), 
('A','2017-03-31',100), 
('A','2017-04-01',120), 
('A','2017-07-31',120) 

SELECT Item,DATEADD(DD,-1,validDate) AS Date,Price FROM @Table 

OUTPUT

Item  Date   Price 
    A  2016-12-31 100 
    A  2017-03-30 100 
    A  2017-03-31 120 
    A  2017-07-30 120 
+0

こんにちは!残念ながら、アウトプットは私が探しているものではありません。多分私の質問は不確かだったでしょう。実際には2017-02-28のデータセットはありませんが、価格は今月の終了日に有効です。価格の開始日は2017-01-01で、終了日は2017-03-31です。ギャップのデータセットを作成するにはどうすればよいですか? – Thorsten

0

私は私が正しくあなたを理解しますが、あなたのテーブルに「ギャップ」を埋めるためにならば、あなたがする必要があるかわかりません毎月の最後の日を挿入します。ここにあなたのためにそれを行うスクリプトがあります。私はSQLでかなり新しいので、これは最善の解決策ではないかもしれませんが、私のために働いた。

declare @dateVar date = '2017-01-01' -- script will start calculating last day of the month from this date. DON'T modify the day value 
declare @yearVar int = '2017' -- script insert months until the end of the year in this variable 

declare @endDates table 
(
item nvarchar(1), 
endOfMonthDate date 
) 

while datepart(year, @dateVar) = @yearVar 
begin 
insert into @endDates 
(item, endOfMonthDate) 
values ( 
'A', 
dateadd(day, -1, dateadd(month, 1, @dateVar)) 
) 
set @dateVar = dateadd(month, 1, @dateVar) 
end 


insert into dbo.table1 
(Item, validDate) 
(
select item, endOfMonthDate 
from @endDates 
where endOfMonthDate not in (
select validDate 
from table1) 
) 

今、正しい価格でレコードを更新することは少しトリッキーになります:それはすでにあなたのvalidDate列に存在した日付とない挿入レコードということではないしてください。まず、月の初めからの価格に基づいて、各月末の価格を設定します。

update dbo.table1 
set table1.Price = t2.Price 
from table1 
left join table1 as t2 
on month(table1.validDate) = MONTH(t2.validDate) 

そして、私たちは前の数ヶ月からの値を使用して価格を持っていない残りのレコードを更新:

declare @loopVar int = 0 
declare @nullsNumb int = (select sum(case when table1.Price is null then 1 else 0 end) from table1) --calculates number of nulls in the Price column 

while @loopVar < @nullsNumb --not so great solution that inserts previous month's price to every record that doesn't have any price at this moment 
begin 
update dbo.table1 
set table1.Price = t2.Price 
from table1 
left join table1 as t2 
on month(table1.validDate) = MONTH(t2.validDate) + 1 
where table1.Price is null 
set @loopVar = @loopVar + 1 
end 

はここvalidDateで注文する場合TABLE1のデータは、今どのように見えるかです:

Item validDate Price 
A   2017-01-01 100 
A   2017-01-31 100 
A   2017-02-28 100 
A   2017-03-31 100 
A   2017-04-01 120 
A   2017-04-30 120 
A   2017-05-31 120 
A   2017-06-30 120 
A   2017-07-31 120 
A   2017-08-31 120 
A   2017-09-30 120 
A   2017-10-31 120 
A   2017-11-30 120 
A   2017-12-31 120 

私が助けられたかどうか教えてください。

+0

本当にありがとう - 実際に私は旅行中です。次の数日間このことをテストしてお知らせします。あなたがプロで初心者ではないようです。 – Thorsten