1

2010 へのアクセスはこちら。

別のパズルゲームに戻ります。私はこのクエリを持っています:

SELECT DischargeDatabase.Date, Avg([pH]) AS [pH Value], Avg([Temperature]) AS [Temperature (°C)], Avg([ZincLevel]) AS [Zinc (mg/l)], Sum([Effluent]) AS [Discharge (gal)], Count(*) AS [# Discharges]
FROM DischargeDatabase
WHERE DischargeDatabase.Date Between Forms!QueryForm!TextCriteriaQ0A And Forms!QueryForm!TextCriteriaQ0B
GROUP BY DischargeDatabase.Date;

私が構築してきた廃水処理データベースから。これにより、pH、温度、および亜鉛レベルを平均し、排出量 (廃液) を合計して、廃水排出量の日ごとの要約が得られます。ユーザーは、日付ピッカーを使用して「QueryForm」の 2 つのテキスト ボックスで範囲を選択し、クエリを実行します。

表示されるのは、その日付範囲で日ごとにグループ化された退院であり、退院があった日のみがリストされます。ユーザーが要求したのは、表示するように選択された範囲内の毎日であり、「DischargeDatabase」にレコードがない日は、フィールド値がゼロになっています。

つまり、これから (2013 年 4 月 11 日から 2013 年 4 月 16 日までの週末の日付範囲):

Date      | ph Value | Temperature (°C) | Zinc (mg/l) | Discharge (gal) | # Discharges
4/11/2013   9.5        18.6               0.89          5000              5
4/12/2013   9.1        17.9               1.68          3000              2
4/15/2013   8.9        19.6               1.47          10000             7
4/16/2013   9.6        18.2               0.35          1500              1

これに:

Date      | ph Value | Temperature (°C) | Zinc (mg/l) | Discharge (gal) | # Discharges
4/11/2013   9.5        18.6               0.89          5000              5
4/12/2013   9.1        17.9               1.68          3000              2
4/13/2013   0.0         0.0               0.0           0                 0
4/14/2013   0.0         0.0               0.0           0                 0
4/15/2013   8.9        19.6               1.47          10000             7
4/16/2013   9.6        18.2               0.35          1500              1

これはすべて、ユーザーが問題なくクエリを Excel スプレッドシートに貼り付けることができるようにするためです。これが可能かどうか、またはクエリの範囲内であるかどうかもわかりません(存在しないレコードを「選択」しています)。ゼロが事前に入力された偽のテーブル/クエリとの何らかの結合が機能する可能性がありますか?

助けとアイデアをありがとう!

4

2 に答える 2

1

あなたは最後の声明で正しい軌道に乗っています!この種のこと - データがなくてもすべてのグループを埋める - は、数値テーブルまたは集計テーブルと呼ばれるものを使用して実行できます。これは、CTE または実際のテーブルであり、やりたいことは何でも可能です。CTEを展開して日付を生成できます...

;WITH CTE AS (
  SELECT 1 as Num
  UNION ALL
  SELECT Num + 1 FROM CTE WHERE Num < @Max
)

SELECT * FROM CTE

このパターンを拡張して日付を生成できます...

declare @startDate datetime
set @startDate = getdate() --to start from today

;WITH CTE AS (
  SELECT @startDate as myDate
  UNION ALL
  SELECT dateadd(day, 1, myDate) as myDate FROM CTE WHERE myDate < dateadd(day, 30, @startDate)
)

SELECT myDate FROM CTE

これで、その CTE を右外部結合の左側のテーブルとして使用できます。Access では、これは実際のテーブルである必要があると思います。1 つ作成し、手動で数値を入力するだけです。これを行う必要があるのは 1 回だけです。

于 2013-04-30T18:49:30.527 に答える
1

これは、カレンダー テーブルを使用するとかなり簡単です。カスタムの CreateTable_calendar および LoadCalendar プロシージャを使用して、独自のプロシージャを作成できます。

日付範囲に基づいてカレンダー テーブルをフィルター処理するクエリを作成し、LEFT JOINそれを他のテーブルに追加します。SELECT(この例では、フィールド リストを簡略化しています。)

SELECT
    c.the_date,
    Count(ddb.Date) AS [# Discharges]
FROM
    tblCalendar AS c
    LEFT JOIN DischargeDatabase AS ddb
    ON c.the_date = ddb.Date
WHERE
    c.the_date Between
            Forms!QueryForm!TextCriteriaQ0A
        And Forms!QueryForm!TextCriteriaQ0B
GROUP BY c.the_date;
于 2013-04-30T18:56:05.287 に答える