سؤال

انظر بيان 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: أعتقد أن المشكلة قد تكون VisData ، لأنني أواجه نتائج مختلفة عبر DAO.

هل كانت مفيدة؟

المحلول

كما أشير بالفعل ، نعم ، هذا هو التأثير. من أجل الاكتمال ، "وجود" مثل "حيث" ، ولكن بالنسبة للقيم المجمعة بالفعل (المجمعة) (مثل ، Max في هذه الحالة ، أو المبلغ ، أو العد ، أو أي من الوظائف الإجمالية الأخرى).

نصائح أخرى

نعم ، سوف يستبعد تلك الصفوف.

نعم ، هذا ما ستفعله.

حيث ينطبق على جميع الصفوف الفردية ، لذلك حيث يتطابق Max (...) مع جميع الصفوف.

وجود مثل أين ، ولكن داخل المجموعة الحالية. هذا يعني أنه يمكنك القيام بأشياء مثل وجود Count (*)> 1 ، والتي ستظهر فقط مجموعات بأكثر من نتيجة واحدة.

للإجابة على سؤالك ، سيتضمن فقط صفوفًا حيث يكون السجل في المجموعة الذي يحتوي على أعلى تاريخ (بحد أقصى) أكبر من 365. في هذه الحالة ، تقوم أيضًا باختيار Max (Date) ، لذلك نعم ، يستبعد الصفوف مع Date_Diff <= 365.

ومع ذلك ، يمكنك تحديد Min (التاريخ) ومعرفة الحد الأدنى للتاريخ في جميع المجموعات التي يبلغ حجمها القصوى أكبر من 365. في هذه الحالة ، لن تستبعد "صفوف" مع Date_diff <= 365 ، بل مجموعات ذات أقصى حد (الحد الأقصى ( Date_diff) <= 365.

نأمل ألا يكون الأمر مربكًا جدًا ...

قد تحاول الشيء الخطأ مع الحد الأقصى الخاص بك. من خلال الحد الأقصى لعمود الفاتورة ، فإنك تبحث بفعالية عن أحدث فاتورة مرتبطة بالعميل. بشكل فعال ، فإن الشرط هو اختيار كل هؤلاء العملاء الذين لديهم ليس كان أي فواتير خلال آخر 365 يومًا.

هل هذا ما كنت تحاول أن تفعل؟ أم أنك تحاول بالفعل الحصول على جميع العملاء الذين لديهم فاتورة واحدة على الأقل من أكثر من عام؟ إذا كان هذا هو الحال ، فيجب عليك وضع الحد الأقصى خارج وظيفة Datediff.

هذا يعتمد على ما إذا كنت تعني الصفوف في الطاولة أو الصفوف في النتيجة. ال having يقوم Cind بترشيح النتيجة بعد التجميع ، لذلك فإنه من شأنه أن يميل إلى عملاء ، وليس الفواتير.

إذا كنت ترغب في تصفية الفواتير الجديدة بدلاً من العملاء الذين لديهم فواتير جديدة ، فيجب عليك استخدامها 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

لن أستخدم مجموعة عن طريق الاستعلام على الإطلاق. باستخدام 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));

المفتاح هنا هو الحصول على مجموعة من أرقام العملاء الذين حصلوا على فاتورة في العام الماضي ، ثم الانضمام الخارجي على هذه النتيجة التي تم تعيينها فقط لإعادة أولئك الذين ليسوا في مجموعة العملاء الذين لديهم فواتير في العام الماضي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top