質問

次の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で行を除外するでしょうか?

ここでの条項の効果は何ですか?

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

edit2:DAOを介してさまざまな結果が発生しているため、問題はVisdataかもしれません。

役に立ちましたか?

解決

すでに指摘したように、はい、それが効果です。完全性のために、「持っている」は「where」のようなものですが、すでに集約されている(グループ化された)値(この場合、最大、または合計、カウント、または他の集計関数など)。

他のヒント

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

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

すべての個々の行に適用される場合、max(...)がすべての行に一致する場合。

持っていることはどこにあるかのようですが、現在のグループ内です。つまり、Count(*)> 1を持つようなことができることを意味します。これは、複数の結果を持つグループしか表示されません。

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

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

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

あなたはあなたのマックスで間違ったことを試みているかもしれません。 Invoice.date列を最大化することにより、顧客に関連付けられた最新の請求書を効果的に探しています。したがって、事実上、条件を持つことは、持っているすべての顧客を選択することです いいえ 持っていました どれか 過去365日以内の請求書。

これはあなたがやろうとしていることですか?それとも、1年以上前から少なくとも1つの請求書を持っているすべての顧客を獲得しようとしていますか?その場合は、最大値をDatediff Functionの外に置く必要があります。

これは、テーブルの行または結果の行を意味するかどうかに依存します。 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

クエリごとにグループを使用しません。標準ジェット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));

ここで重要なのは、昨年請求書を持っていた顧客番号のセットを取得し、その結果に外側の結合を行い、昨年に請求書を持っている顧客のセットではない人のみを返すようにすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top