簡體   English   中英

COUNT()個MySQL中MAX()出現的次數

[英]COUNT() the number of MAX() occurrences in MySQL

我有一個捐贈數據庫,我要針對它運行的報告之一,包括與最大捐贈月份數相等的捐贈數量。 例如,每月的最高捐款額可能是100美元,但是可能有5個人都捐款了100美元,我想得到這個數字。

我當前的查詢是:

SELECT SUM(mc_gross) AS Donations,
       SUM(mc_fee) AS Fees,
       COUNT(payment_date) AS DontationCount,
       COUNT(DISTINCT payer_email) AS DonatorCount,
       MAX(mc_gross) AS MaxDonation,
       @MaxD:=MAX(mc_gross),
       (
            SELECT COUNT(*)
            FROM #__paypal_donations
            WHERE MONTH(payment_date) = MONTH(CURDATE())
            AND YEAR(payment_date) = YEAR(CURDATE())
            AND mc_gross = @MaxD
       ) as MaxDonationMultiplier,
       AVG(mc_gross) AS AverageDonation
FROM #__paypal_donations
 WHERE MONTH(payment_date) = MONTH(CURDATE())
   AND YEAR(payment_date) = YEAR(CURDATE())

所以我想我可能已經接近了,但是看起來我存儲在@MaxD中的值不能在我的子查詢中使用,或者mc_gross = @MaxD中的比較本身不起作用,因為如果我將@MaxD替換為實際的值我得到適當的計數。

您不能依賴於MySQL中表達式的分配順序。 這使得像您這樣的查詢非常危險。 幸運的是,您可以使用相關的子查詢輕松解決此問題:

SELECT SUM(mc_gross) AS Donations, SUM(mc_fee) AS Fees, COUNT(payment_date) AS DontationCount,
       COUNT(DISTINCT payer_email) AS DonatorCount, MAX(mc_gross) AS MaxDonation,
       (SELECT COUNT(*)
        FROM #__paypal_donations pd2
        WHERE MONTH(pd2payment_date) =  MONTH(pd.payment_date)) AND
              YEAR(pd2payment_date) = YEAR(pd.payment_date) AND
              pd2.mc_gross = MAX(mc_gross)
       ) as MaxDonationMultiplier,
       AVG(mc_gross) AS AverageDonation
FROM #__paypal_donations pd
WHERE MONTH(payment_date) = MONTH(CURDATE()) AND
      YEAR(payment_date) = YEAR(CURDATE());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM