簡體   English   中英

與多個嵌套選擇的左聯接

[英]LEFT JOIN with multiple nested select

以下語句出人意料地起作用,但是我不確定3次加入同一張表是否有效。 我必須禁用ONLY_FULL_GROUP_BY才能使其正常運行。

有2張桌子在玩。 一個是包含Distributor信息的主表,第二個是包含主表(assoc)中關聯的Distributor的amountdateid的購買表。

我需要三件事。 年初至今的銷售額,該總額表示某個分銷商從當年起的銷售額。 去年的銷售額,與上一年相同。 然后,最后只需獲取最新的購買日期和金額即可。

用戶需要能夠按這些值( lysytd等)進行過濾,因此將它們作為變量連接似乎是一種方法。 數據庫大小約為7,000條記錄。

SELECT 
    d.*,
    ytd_total,
    lys_total,
    last_amount,
    last_purchase

FROM Distributor as d
LEFT JOIN (
    SELECT
        assoc, SUM(amount) ytd_total
        FROM purchases
        WHERE db = 1 AND purchase_date >= '{$year}-01-01'
        GROUP BY assoc
) AS ytd
ON ytd.assoc = d.id

LEFT JOIN (
    SELECT
        assoc, SUM(amount) lys_total
        FROM purchases
        WHERE db = 1 AND purchase_date BETWEEN '{$lyear}-01-01' AND '{$lyear}-12-31'
        GROUP BY assoc
) AS lys
ON lys.assoc = d.id

LEFT JOIN (
    SELECT
        assoc, amount last_amount, purchase_date last_purchase
        FROM purchases
        WHERE db = 1
        GROUP BY assoc
) AS lst
ON lst.assoc = d.id

WHERE ........

您可以在每個聚合查詢中做更多的工作。 我認為這更是您想要的:

select d.*, pa.ytd_total, pa.lys_total, pa.last_purchase_date, p.amount
from distributor d left join
     (select p.assoc,
             sum(case when p.purchase_date >= '{$year}-01-01' then p.amount end) as ytd_total,
             sum(case when p.purchase_date BETWEEN '{$lyear}-01-01' AND '{$lyear}-12-31' then p.amount end) as lys_total,
             max(p.purchase_date) as last_purchase_date             
      from purchases p
      where p.db = 1
      group by p.assoc
     ) pa left join
     purchases p
     on pa.assoc = p.assoc and pa.last_purchase_date = p.purchase_date;

暫無
暫無

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

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