3

次の SQL ステートメントを参照してください。

SELECT datediff("d", MAX(invoice.date), Now) As Date_Diff
      , MAX(invoice.date) AS max_invoice_date
      , customer.number AS customer_number
FROM invoice 
    INNER JOIN customer 
        ON invoice.customer_number = customer.number
GROUP BY customer.number 

以下が追加された場合:

HAVING datediff("d", MAX(invoice.date), Now) > 365

これは単に Date_Diff <= 365 の行を除外しますか?

ここで HAVING 句の効果はどうなるでしょうか?

編集:ここでの回答が言っていることを経験していません。mdb のコピーはhttp://hotfile.com/dl/40641614/2353dfc/test.mdb.htmlにあります (マクロやウイルスは含まれていません)。VISDATA.EXE はクエリの実行に使用されています。

EDIT2:DAOを介して異なる結果が発生しているため、問題はVISDATAである可能性があると思います。

4

7 に答える 7

5

すでに指摘したように、はい、それが効果です。完全を期すために、'HAVING' は 'WHERE' に似ていますが、既に集計 (グループ化) された値 (この場合は MAX、SUM、COUNT、その他の集計関数など) を対象としています。

于 2010-04-30T14:53:43.497 に答える
1

はい、それらの行は除外されます。

于 2010-04-30T14:46:10.957 に答える
0

WHEREは個々の行すべてに適用されるため、WHERE MAX(...)はすべての行に一致します。

HAVINGはWHEREに似ていますが、現在のグループ内にあります。つまり、HAVING count(*)> 1のようなことができ、複数の結果を持つグループのみが表示されます。

したがって、質問に答えるには、グループ内で最高(MAX)の日付を持つレコードが365より大きい行のみが含まれます。この場合、MAX(date)も選択しているため、date_diffの行は除外されます。 <=365。

ただし、MIN(date)を選択して、最大日付が365を超えるすべてのグループの最小日付を表示できます。この場合、date_diff <= 365の「行」ではなく、max( date_diff)<=365。

うまくいけば、それはあまり混乱していません...

于 2010-04-30T14:56:18.000 に答える
0

GROUP BY クエリはまったく使用しません。標準の Jet SQL を使用する:

  SELECT Customer.Number
  FROM [SELECT DISTINCT Invoice.Customer_Number
     FROM Invoice
     WHERE (((Invoice.[Date])>Date()-365));]. AS Invoices 
  RIGHT JOIN Customer ON Invoices.Customer_Number = Customer.Number
  WHERE (((Invoices.Customer_Number) Is Null));

SQL92 互換モードの使用:

  SELECT Customer.Number
  FROM (SELECT DISTINCT Invoice.Customer_Number
     FROM Invoice
     WHERE (((Invoice.[Date])>Date()-365));) AS Invoices 
  RIGHT JOIN Customer ON Invoices.Customer_Number = Customer.Number
  WHERE (((Invoices.Customer_Number) Is Null));

ここで重要なのは、昨年請求書を発行した一連の顧客番号を取得し、その結果セットに対して OUTER JOIN を実行して、昨年請求書を発行した一連の顧客に含まれていない顧客のみを返すことです。

于 2010-05-02T01:14:42.883 に答える
0

はい、それはそれがすることです。

于 2010-04-30T14:47:36.057 に答える
0

MAX で間違ったことをしようとしている可能性があります。Invoice.date 列を MAXing することで、顧客に関連付けられた最新の請求書を効率的に検索できます。したがって、事実上、HAVING 条件は、過去 365 日以内に請求書を受け取っないすべての顧客を選択することになります。

これはあなたがやろうとしていることですか?それとも、実際には、1 年以上前に少なくとも 1 つの請求書があるすべての顧客を取得しようとしていますか? その場合は、MAX を datediff 関数の外に置く必要があります。

于 2010-05-01T04:34:59.723 に答える
0

それは、テーブル内の行を意味するのか結果内の行を意味するのかによって異なります。このhaving句は、グループ化後に結果をフィルタリングするため、請求書ではなく顧客が除外されます。

新しい請求書を持つ顧客ではなく、新しい請求書をフィルターで除外する場合は、whereグループ化する前にフィルター処理できるように、代わりに次を使用する必要があります。

select
  datediff("d",
  max(invoice.date), Now) As Date_Diff,
  max(invoice.date) as max_invoice_date,
  customer.number
from
  invoice 
  inner join customer on invoice.customer_number = customer.number
where
  datediff("d", invoice.date, Now) > 365
group by
  customer.number
于 2010-05-01T04:35:50.303 に答える