0

2 つの同義語を参照してビューを作成しました。ビュー テーブルを取得する必要がある現在のクエリは次のとおりです。

SELECT  dbo.synonym1.JobNo
      , dbo.synonym1.Customer
      , dbo.synonym2.PostalService
      , dbo.synonym2.FirstDate
      , dbo.synonym2.SecondDate
FROM dbo.synonym1 
  INNER JOIN dbo.synonym2 ON dbo.synonym1.JobNo = sbo.synonym2.JobNo
WHERE dbo.synonym2.PostalService = 'UPS'

ここで、各行とdbo.synonym2.FirstDate同じ行の違いを、違いがあれば何度でもビュー テーブルに戻したいと思います。dbo.synonym2.SecondDateINSERT

たとえば、FirstDateis2012-06-03 00:00:00.000SecondDateisの場合2012-06-05 00:00:00.000、同じ行を 2 回挿入する必要があります。

私は SQL Server 2008 R2 を使用しており、SQL の初心者です。私を助けてください

ビューで上記のクエリを使用して現在取り込まれているサンプル データは次のとおりです。

JobNo  Customer PostalService FirstDate                 SecondDate  
1      ABC      UPS           2012-06-03 00:00:00.000   2012-06-03 00:00:00.000
2      DEF      UPS           2012-06-03 00:00:00.000   2012-06-06 00:00:00.000
3      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000

以下のような結果が必要です

JobNo  Customer PostalService FirstDate                 SecondDate  
1      ABC      UPS           2012-06-03 00:00:00.000   2012-06-03 00:00:00.000
2      DEF      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000
2      DEF      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000
2      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000
3      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-06 00:00:00.000
3      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-06 00:00:00.000

JobNo 2 の日付の差が 3 である場合、データは 3 回繰り返されます。JobNo 3 は 2 であるため、データは 2 回繰り返されます。

4

3 に答える 3

1

通常、ビューに挿入されないため、リクエストは少し混乱します。

ただし、以下はテーブルに行を挿入します

insert into ViewTable(JobNo, Customer, PostalService, FirstDate, SecondDate)
    SELECT dbo.synonym1.JobNo, dbo.synonym1.Customer, dbo.synonym2.PostalService,
           dbo.synonym2.FirstDate, dbo.synonym2.SecondDate
     FROM dbo.synonym1 INNER JOIN
          dbo.synonym2
          ON dbo.synonym1.JobNo = sbo.synonym2.JobNo
     WHERE dbo.synonym2.PostalService = 'UPS' and
           datediff(d, FirstDate, SecondDate) <> 0

ただし、ViewTableを実際のテーブルとして定義する必要があります。

于 2012-06-05T16:12:07.567 に答える
0
Create Table #temp
(
    StartDate DateTime,
    EndDate DateTime
)

Insert into #temp(StartDate, EndDate)
                    Values('2012-06-03 00:00:00.000', '2012-06-03 00:00:00.000');
Insert into #temp(StartDate, EndDate)
                    Values('2012-06-03 00:00:00.000', '2012-06-06 00:00:00.000');
Insert into #temp(StartDate, EndDate)
                    Values('2012-06-03 00:00:00.000', '2012-06-05 00:00:00.000');

With DateRange As
(
    select Convert(DateTime, '2012-06-02 00:00:00.000') as StartDate, 
          DATEADD(dd, 1, Convert(DateTime, '2012-06-02 00:00:00.000')) as EndDate
    Union All
    select EndDate, DATEADD(dd, 1, EndDate) From DateRange 
                    Where EndDate <= Convert(DateTime, '2012-06-10 00:00:00.000')
)

Select T.* from #temp T
Left Join DateRange R on ((T.StartDate < R.EndDate and T.EndDate > R.StartDate) 
          or (T.StartDate = R.EndDate and T.EndDate = R.StartDate))
order  by T.EndDate

Drop table #temp
于 2012-06-05T16:20:51.520 に答える
0

この一時テーブルにデータを入力するには、以下のユニオンステートメントが必要なようです。あなたが求めていることを私が誤解していない限り。

DECLARE @MyTable as TABLE(JobNo VARHCAR(50), Customer VARCHAR(50), 
                       Postalservice VARCHAR(50), MyDate DateTime)

INSERT into @MyTable 
SELECT  dbo.synonym1.JobNo 
  , dbo.synonym1.Customer 
  , dbo.synonym2.PostalService 
  , dbo.synonym2.FirstDate 

FROM dbo.synonym1  
INNER JOIN dbo.synonym2 ON dbo.synonym1.JobNo = sbo.synonym2.JobNo 
WHERE dbo.synonym2.PostalService = 'UPS'  
UNION
SELECT  dbo.synonym1.JobNo 
  , dbo.synonym1.Customer 
  , dbo.synonym2.PostalService 

  , dbo.synonym2.SecondDate 
FROM dbo.synonym1  
INNER JOIN dbo.synonym2 ON dbo.synonym1.JobNo = sbo.synonym2.JobNo 
WHERE dbo.synonym2.PostalService = 'UPS'     

@MyTable からビューに INSERT

于 2012-06-05T16:07:05.257 に答える