0

リレーションのない 2 つのテーブルがあり、両方のテーブルの列数が異なりますが、同じであるが異なるデータを保持する列がいくつかあります。必要なデータのみの関数またはビューを作成できましたが、日付をフィルター処理してデータをカウントしようとすると、常に間違ったカウントが返されます。2つの機能と私がやろうとしていることを示して説明しましょう:

機能 1

ID - number from 1 to 8
data sent - YES or NO 
Date - date value

機能 2

ID - number from 1 to 8
data sent - yes or no
date - date value

両方を別々に実行すると、テーブルからすべての行が取得され、すべてがうまく見えます。

次に、各関数に次を追加しようとします。

select 
     count([data sent]), ID 
from function1 
Where (date between @date1 and @date2) 
group by ID

上記のステートメントはうまく機能し、各関数に対して正しい結果が得られます。

ここで、これら 2 つの関数を 1 つに追加して、1 ページで両方の関数からカウントを取得したい場合はどうすればよいか考えました。

そこで、次の関数を作成しました。

機能 3

select 
    count(Function1.[data sent]) as Expr1, 
    Function1.id, 
    count(Function2.[data sent]) as Expr2, 
    Function1.date
from 
    Function1 
LEFT OUTER JOIN 
    Function2 on Function1.id = Function2.id
Where 
    (Function1.date between @date1 and @date2)
group by 
    Function1.id

上記を実行すると、次の表が得られます。

ID  Expr1  Expr2

Expr1 と Expr2 の両方で、どこから来たのかわからない結果が得られます。1 つのテーブルにはほぼ 15000 行が保持され、もう 1 つのテーブルには約 5000 行が保持されるため、何かが 100000 倍されていると思います。

最初に知りたいのは、日付でフィルタリングし、両方のテーブルから同時にレコードをカウントできるかどうかです。さらに詳しい情報が必要な場合はお知らせください。喜んで共有し、詳しく説明いたします。

ありがとうございました

4

3 に答える 3

0

サブクエリは、あなたが望むものを達成するのに役立つかもしれません:

SELECT
  ID   = COALESCE(f1.ID,   f2.ID),
  Date = COALESCE(f1.Date, f2.Date),
  f1.Expr1,
  f2.Expr2
FROM (
  SELECT
    ID,
    Date,
    Expr1 = COUNT([data sent])
  FROM Function1
  WHERE Date BETWEEN @date1 AND @date2
  GROUP BY
    ID,
    Date
) f1
FULL JOIN (
  SELECT
    ID,
    Date,
    Expr2 = COUNT([data sent])
  FROM Function2
  WHERE Date BETWEEN @date1 AND @date2
  GROUP BY
    ID,
    Date
) f2
ON f1.ID = f2.ID AND f1.Date = f2.Date

このクエリは、結合の右側に左側に一致しない行が含まれている場合 (およびそれらの行が必要な場合) に、左結合の代わりに完全 (外部) 結合も使用します。

于 2012-04-29T23:22:19.837 に答える
0

関数ごとに一時テーブルを作成して結合できないのはなぜですか?

于 2012-04-29T18:30:28.120 に答える
0

LEFT OUTER JOIN、左側のテーブルの各行を取得し、同じidフィールドを持つ右側のテーブルのすべての行を見つけて、結果テーブルにその数の行を作成します。これidは、私たちが通常 ID フィールドとして考えているものではないため ("deviceId" などのように見えます)、それぞれのフィールドに多くの一致が得られます。15000 回繰り返すと、組み合わせ爆発が発生します。

ヒント: このようなことをデバッグするには、実際のデータの小さなサブセット (それぞれから 10 行など) を含むサンプル テーブルを作成し、それらに対してクエリを実行します。問題はすぐにわかります。

日付で絞り込むことができます。「これら2つの機能を1つに追加し、1ページで両方の機能からカウントを取得したい」というフレーズをよく理解せずに、実際のソリューションを推奨することは困難です.

于 2012-04-29T17:47:45.987 に答える