0

ユーザーが .aspx ページから "track" テーブルにデータを入力しています。彼らはさまざまな活動の一連の日付を入力し、その日付を思い出させたい場合はボックスをチェックしています。現時点で私が抱えている特定の問題は、IN ステートメントの列を制限することです。

SELECT [id], [name], MIN([DATE]) AS [MinDate] 
FROM track UNPIVOT ([DATE] FOR d IN ([date1],[date2],[date2])) unpvt
GROUP BY [id], [name]

date1date1chkの値が の場合にのみ含めたい1。同様に、date2if date2chkis "1" などです。それ以外の場合、そのdate#列は IN に含まれません。

この後、私の課題は、たとえばが最小だった場合に、特定のレコードに対してからにdate2chk設定されるようにテーブルを更新できるようにすることです。10date2

あなたの考えは大歓迎です。これは、私が対処した中で最も困難な問題の 1 つであることを証明しています。

編集(フィードバックありがとうございます):

データ

ID       Date1       Date1Chk         Date2      Date2Chk       Date3        Date3Chk
0     2013-01-15        0          2013-02-01       1        2013-02-10         1
1     2013-02-05        1          2013-02-05       1        2013-02-10         0

望ましい結果

ID    MinDate
0    2013-02-01
1    2013-02-05

この結果が得られると仮定すると、テーブルをどのように更新するかはわかりません。たとえば、「望ましい結果」では、ID 1 は [Date1] と [Date2] の両方に存在する最小値を返しています。ユーザーが最初のインスタンスでリマインダーを停止するようにしたいので、[Date1Chk] は ([Date2Chk] ではなく) 0 に設定されます。

4

2 に答える 2

0

をサブクエリに移動しunpivotて、列の名前を取得できるようにします。次に、where句が問題を解決します。

select id, name, min([date]) as mindate
from (SELECT [id], [name], d, [DATE]
      FROM track
      UNPIVOT ([DATE] FOR d IN ([date1], [date2], [date2])) unpvt
    ) t
where (d = 'date1' and datecheck1 = 1) or
      (d = 'date2' and datecheck2 = 1) or
      (d = 'date3' and datecheck3 = 1)
GROUP BY [id], [name]

特定の日付を取得するには、row_number()代わりにgroup by次を使用します。

select id, name, [date] as mindate
from (select id, name, [date],
             row_number() over (partition by id, name order by [date]) as seqnum
      from (SELECT [id], [name], d, [DATE]
            FROM track
            UNPIVOT ([DATE] FOR d IN ([date1], [date2], [date2])) unpvt
          ) t
      where (d = 'date1' and datecheck1 = 1) or
            (d = 'date2' and datecheck2 = 1) or
            (d = 'date3' and datecheck3 = 1)
     ) t
where seqnum = 1
于 2013-04-14T19:11:53.980 に答える