1

以下は私のテーブルのサンプルレコードです。

フィールドはvarcharで、ToDateには2つの空のレコードが含まれています。(データベースNULLではありません)

CustomerID  FromDate    ToDate
1           20120810    20120920
2           20120901    20120915
3           20120112    
4           20120815    
5           20120817    20120920
6           20120817    20120920

以下のルールに従う必要があります。

  1. ToDate列の最も遠い日付で並べ替えます。
  2. レコードが空の場合、空ではなく現在の日付+30を取得します。
  3. ToDateで2つの日付が同じである場合は、FromDateで最も遠い日付を取得します。

したがって、上記のレコードのサンプルでは、​​次のような出力が必要です。

CustomerID   FromDate   ToDate
3            20120112   20130221

顧客ID4と5のToDateは空であるため、getdate()関数から30日を追加する必要があると考えます。つまり、Todateは等しいので、FromDateで並べ替えたいと思います。

日付の入力は20120810です

select   top 1 customer_id, 
max(convert(datetime,Fromdate,101)) as Fromdate,
convert(datetime,(CASE WHEN Todate = '' THEN getdate() + 30 WHEN Todate != '' THEN Todate END),101) as Todate,
customer_id
FROM  dbo.sample_tbl (nolock)
 WHERE  customer_id = '1' 
 AND    Fromdate <= '20120810'
 AND    (CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END) >= '20120810'
group by convert(datetime,(CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END),101),customer_id
order by convert(datetime,(CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END),101) desc

現在の出力は

CustomerID   FromDate  ToDate
3            20120112  20130221

期待されるのは

CustomerID   FromDate   ToDate
3            20120815   20130221
4

2 に答える 2

0

SQLServer 2005 以降の場合

 ;WITH cte AS
 ( 
  SELECT CustomerID,         
         MAX(CAST(FromDate AS date)) OVER (PARTITION BY
         (CASE WHEN ToDate = '' THEN CAST(GETDATE() + 30 AS date) ELSE CAST(ToDate AS date) END
         )) AS FromDate,         
         CASE WHEN ToDate = '' THEN CAST(GETDATE() + 30 AS date) ELSE CAST(ToDate AS date) END AS ToDate
  FROM dbo.sample_tbl
  )
  SELECT TOP 1 CustomerID, MAX(FromDate) AS FromDate, ToDate
  FROM cte
  GROUP BY ToDate, CustomerID
  ORDER BY ToDate DESC

SQLFiddle のデモ

于 2013-01-22T11:58:02.773 に答える
0

コードが複雑すぎて冗長だと思います。enddate を取得するには、SQL 関数を作成する必要があります。この関数を getEndDate (String date) と呼びます (自分で作成できると思います)

クエリは次のようになります。

select  CustomerID  ,FromDate  , getEndDate (ToDate) 
from sample_tbl
order by getEndDate (ToDate) desc, FromDate  desc  ;

そしてあなたは最初の行を取ります。

于 2013-01-22T10:59:32.760 に答える