2017-12-29 85 views
0

MS Access DBでは、クライアントの到着日と出発日に関する情報があります。これに基づいて、週に訪問するクライアントの数を計算したいと思います。MS Accessの開始日と終了日に基づいてクライアントを週ごとに計算する

次の例を考えてみましょう。ピーターは1月の第1週に到着し、第3週に休みます(週は日曜日に始まります)。一方、メアリーは最初の週に到着し、葉。

enter image description here

Iは最初の列の週番号と第二におけるゲストの合計数と、以下に示すように出力になりたいです。

enter image description here

このくださいを達成するための最良の方法は何ですか?

+0

SQLまたはAccessでこれを実行しますか? – Vashi

+0

第1週は2017年12月31日または1月7日に始まりますか? –

+0

ドイツの週には、1月1日に開始されます.2018 – twyly

答えて

0

私のドイツ語の日付形式のソリューションは、ORACLEでテストします。私はそれに参加するために毎週いくつかのカレンダーテーブル(tw_test_week)を構築します。

CREATE TABLE tw_test_client (
client VARCHAR2(10), 
arrival DATE, 
departure DATE 
); 

INSERT INTO tw_test_client VALUES 
('Peter', to_date('01.01.2018','DD.MM.YYYY'), to_date('11.01.2018','DD.MM.YYYY')); 

INSERT INTO tw_test_client VALUES 
('Mary', to_date('01.01.2018','DD.MM.YYYY'), to_date('01.02.2018','DD.MM.YYYY')); 

CREATE TABLE tw_test_week (
weekid INT, 
started DATE, 
ended DATE 
); 

INSERT INTO tw_test_week VALUES 
(to_char(to_date('01.01.2018','DD.MM.YYYY'),'WW'), 
    to_date('01.01.2018','DD.MM.YYYY'), 
    to_date('07.01.2018','DD.MM.YYYY') 
); 

INSERT INTO tw_test_week VALUES 
(to_char(to_date('08.01.2018','DD.MM.YYYY'),'WW'), 
    to_date('08.01.2018','DD.MM.YYYY'), 
    to_date('14.01.2018','DD.MM.YYYY') 
); 

INSERT INTO tw_test_week VALUES 
(to_char(to_date('15.01.2018','DD.MM.YYYY'),'WW'), 
    to_date('15.01.2018','DD.MM.YYYY'), 
    to_date('21.01.2018','DD.MM.YYYY') 
); 

INSERT INTO tw_test_week VALUES 
(to_char(to_date('22.01.2018','DD.MM.YYYY'),'WW'), 
    to_date('22.01.2018','DD.MM.YYYY'), 
    to_date('28.01.2018','DD.MM.YYYY') 
); 

INSERT INTO tw_test_week VALUES 
(to_char(to_date('29.01.2018','DD.MM.YYYY'),'WW'), 
    to_date('29.01.2018','DD.MM.YYYY'), 
    to_date('04.02.2018','DD.MM.YYYY') 
); 

SELECT w.weekid, COUNT(*) 
    FROM tw_test_week w 
    JOIN tw_test_client c 
    ON w.started BETWEEN c.arrival and c.departure 
GROUP BY w.weekid 
ORDER BY w.weekid; 

結果

WEEKID COUNT 
1 2 
2 2 
3 1 
4 1 
5 1 
+0

提案していただきありがとうございますが、私はもっとスケーラブルなものを望んでいました。次の100週間のカウントを確認したい場合は、tw_test_weekに100レコードを手動で作成する必要があります。 – ganninu93

0

私のクエリで53にこの表を番号1を含む表を作成しWeekNumTableと呼ばれ、表示された各週番号を持つ単一のフィールドが含まれています。データテーブルにはそうではないあなたは、1つのクライアントを持つものとして週3リストとして

SELECT  WeekNum 
      , COUNT(WeekNum) AS TotalClients 
FROM  WeekNumTable INNER JOIN ClientTable ON 
       WeekNumTable.WeekNum>=DatePart("ww",ClientTable.Arrival-Weekday(ClientTable.Arrival,1)+7) AND 
       WeekNumTable.WeekNum<=DatePart("ww",ClientTable.Departure-Weekday(ClientTable.Departure,1)+7) 
GROUP BY WeekNum 

あなたの例では、私は少し混乱しました。

編集:私はこれを見ることができます一つの問題は、あなたが次の100週を見てみたい場合は、ひとまとめにされる両年度からそうでない場合は、週1年間を分離するために何かをする必要がありますということです。

0

これを取得するために一連のクエリを使用できます。

まず、名前付きクエリテン作成:

SELECT DISTINCT Abs([id] Mod 10) AS N 
FROM MSysObjects; 

が続いてクエリを作成することができ、ClientDays、最初に到着し、最新の出発の間のすべてのあなたの日付一覧表示されます:

SELECT DISTINCT 
    [Ten_0].[N]+[Ten_1].[N]*10+[Ten_2].[N]*100 AS Id, 
    DateAdd("d",[Ten_0].[N]+[Ten_1].[N]*10+[Ten_2].[N]*100,[StartDate]) AS [Date] 
FROM 
    Ten AS Ten_0, 
    Ten AS Ten_1, 
    Ten AS Ten_2, 
    (Select 
     Min([Arrival]) As StartDate, 
     DateDiff("d", Min([Arrival]), Max([Departure])) As Days 
    From 
     ClientDates) AS T 
WHERE 
    ((([Ten_0].[N]+[Ten_1].[N]*10+[Ten_2].[N]*100)<=[Days]) 
    AND 
    ((Ten_0.N)<=[Days]\1) 
    AND 
    ((Ten_1.N)<=[Days]\10) 
    AND 
    ((Ten_2.N)<=[Days]\100)); 

クエリーでこれを使用すると、ClientWeeks、週番号を確認できます。

SELECT 
    Year([Date]) AS [Year], 
    DatePart("ww",[Date]) AS Week, 
    ClientDates.Client 
FROM 
    ClientDays, 
    ClientDates 
WHERE 
    ClientDays.Date Between [Arrival] And [Departure] 
GROUP BY 
    Year([Date]), 
    DatePart("ww",[Date]), 
    ClientDates.Client; 

最後に、クライアントを数える:

SELECT 
    ClientWeeks.Year, 
    ClientWeeks.Week, 
    Count(ClientWeeks.Client) AS TotalClients 
FROM 
    ClientWeeks 
GROUP BY 
    ClientWeeks.Year, 
    ClientWeeks.Week; 

あなたが一貫性のない週のナンバリング方式を使用すると、あなたがトラブル新年の周りにカウントを持っていることに注意してください。第一および/または最後の週は、暦年の境界を横断するので、あいまいで

のみ週数はYYYY-WWISO-8601システムです。

ネイティブのVBA関数では実行できないように実装する場合はメモを残してください。カスタム関数を使用する必要がありますが、使用しない場合はここに投稿したくありません。

+0

[一連の日付を作成する](https://stackoverflow.com/a/37509312/3527297)のこの簡単な方法も参照してください。 – Gustav

関連する問題