2

ドキュメントの進行状況を経時的に追跡する Access 2007 データベースがあります。進行は次のようになります。

  1. 作成した
  2. レビューのために送信
  3. 審査
  4. 承認のために送信
  5. 承認済み

次のような列を持つドキュメント ステータスの変更履歴テーブルを作成しました。

hist_id    doc_id    month   step    status  datestamp

次のように、月末のステータスを返すクエリを作成しました。

SELECT doc_id, month, step, status, datestamp
FROM hist
WHERE (((hist.datestamp) In 
(
      Select Top 1 h.[datestamp]
      From hist as h
      Where h.[doc_id] = hist.[doc_id] and h.[month] = hist.[month]
      Order By h.[datestamp] DESC))
)
ORDER BY month, doc_id DESC;

取得するため....

doc_id  month   step status             datestamp
a       2011-01 2    sent for review    18/01/2011
b       2011-02 1    created            01/02/2011
a       2011-02 3    reviewed           19/02/2011
c       2011-03 1    created            07/03/2011
d       2011-03 1    created            08/03/2011
e       2011-06 1    created            14/06/2011
f       2011-07 1    created            05/07/2011
g       2011-07 4    sent for approval  18/07/2011
h       2011-07 2    sent for review    14/07/2011
f       2011-08 3    reviewed           29/08/2011
g       2011-08 5    approved           17/08/2011
h       2011-08 1    created            10/08/2011
e       2011-09 3    reviewed           17/09/2011

しかし、私が本当に必要としているのは、ステータスが変更されていない月のドキュメントも返すクエリです。たとえば、 documentaのステータスがreviewedon19/02/2011になりましたが、上記の結果に表示されるのはこれが最後です。reviewed実際には、その後になるまで毎月表示されるはずsent for approvalです。

そのため、クエリを変更 (または上記のクエリをクエリ) して、以下のような結果を提供しようとしています...

 doc_id month   step    status          datestamp
a   2011-01 2   sent for review     18/01/2011
a   2011-02 3   reviewed        19/02/2011
b   2011-02 1   created         01/02/2011
a   2011-03 3   reviewed        19/02/2011
b   2011-03 1   created         01/02/2011
c   2011-03 1   created         07/03/2011
d   2011-03 1   created         08/03/2011
a   2011-04 3   reviewed        19/02/2011
b   2011-04 1   created         01/02/2011
c   2011-04 1   created         07/03/2011
d   2011-04 1   created         08/03/2011
a   2011-05 3   reviewed        19/02/2011
b   2011-05 1   created         01/02/2011
c   2011-05 1   created         07/03/2011
d   2011-05 1   created         08/03/2011
a   2011-06 3   reviewed        19/02/2011
b   2011-06 1   created         01/02/2011
c   2011-06 1   created         07/03/2011
d   2011-06 1   created         08/03/2011
e   2011-06 1   created         14/06/2011
a   2011-07 3   reviewed        19/02/2011
b   2011-07 1   created         01/02/2011
c   2011-07 1   created         07/03/2011
d   2011-07 1   created         08/03/2011
e   2011-07 1   created         14/06/2011
f   2011-07 1   created         05/07/2011
g   2011-07 4   sent for appr   18/07/2011
h   2011-07 2   sent for rev    14/07/2011
a   2011-08 3   reviewed        19/02/2011
b   2011-08 1   created         01/02/2011
c   2011-08 1   created         07/03/2011
d   2011-08 1   created         08/03/2011
e   2011-08 1   created         14/06/2011
f   2011-08 3   reviewed        29/08/2011
g   2011-08 5   approved        17/08/2011
h   2011-08 1   created         10/08/2011
a   2011-09 3   reviewed        19/02/2011
b   2011-09 1   created         01/02/2011
c   2011-09 1   created         07/03/2011
d   2011-09 1   created         08/03/2011
e   2011-09 1   reviewed        17/09/2011
f   2011-09 3   reviewed        29/08/2011
g   2011-09 5   approved        17/08/2011
h   2011-09 1   created         10/08/2011

助けてくれてありがとう...私は本当にここから始めるべきかさえ知りません.

4

2 に答える 2

1

スパーキーの答えからのいくつかの手がかりのおかげで、私は自分に合ったものをまとめることができました.

手順

  1. months次のような月のリストを含むテーブルを作成します2011-08
  2. month_range実際のドキュメントから月の範囲を取得するクエリを作成する

    SELECT month_no FROM months WHERE month BETWEEN (履歴の最小月) AND (履歴の最大月)

  3. month_rangeおよびhistテーブルでクロス積クエリを実行します。ここで、 hist.month_no<=month_range.month

  4. 上記の手順により、ドキュメントごとに月ごとに複数のステータス変更を含むテーブルが残ります。SELECTでGROUP BYをオンmonth_nodoc_noして使用するだけですmax(hist_id)

  5. ステータスへのアクセスを取得するためにhist使用するテーブルを使用して、上記の結果を INNER JOIN しますhist_id

私が使用した正確な最終クエリは次のようになります....

SELECT xx.month_no, xx.swp, xx.hist_id, h.status

FROM 
(
     SELECT zz.month_no, zz.swp, Max(zz.hist_id) AS hist_id
     FROM 
     (
          SELECT * FROM month_range AS mr, hist AS h 
          WHERE h.[first_of_month] <= mr.[first_of_month]
     ) zz
     GROUP BY zz.month_no, zz.swp

)  xx 

INNER JOIN hist as h ON xx.hist_id = h.hist_id;
于 2011-09-06T07:38:51.773 に答える
1

これは SQL で機能し、特別な機能を使用しないため、MS-ACCESS SQL でも機能するはずです。

まず、月のテーブルを作成する必要があります。

create table monthly (monthN char(7))

insert into monthly values('2011-01')
insert into monthly values('2011-02')
...

必要なすべての月を入力します。

そのテーブルを構築すると、次のクエリは探しているものを返すはずです。

select d1.doc_id,d1.monthN,d1.step,d1.status,d1.dateStamp
from monthly m1
join docs d1 on d1.monthN=m1.monthN
union
select d2.doc_id,zz.monthN,d2.step,d2.status,d2.dateStamp
from docs d2
join
(
    select aa.doc_id,aa.monthN,bb.EndM from
    (
    select yy.doc_id,yy.monthN from
    (   
        select d3.doc_id,m2.monthN
        from monthly m2
        join (select distinct doc_id from docs) d3 on 1=1
        ) yy
    left join docs xx on xx.doc_id=yy.doc_id and xx.monthN=yy.MonthN
    where xx.hist_id is null
    ) aa
    join (select doc_id,MIN(monthN) as startM,MAX(monthN) as EndM 
          from docs group by doc_id) 
          bb on bb.doc_id=aa.doc_id and aa.monthN>=bb.StartM
) zz
on zz.doc_id=d2.doc_id and zz.EndM=d2.monthN
order by d1.monthN,d1.doc_id 

何が行われているかを追跡できるように、各内部クエリを個別に実行することをお勧めします...

于 2011-09-04T13:51:13.203 に答える