2017-10-20 267 views
1

我正在運行一個查詢來撤回在我們的系統中製作的數據,並將其與單獨的發票表進行比較,該表正在工作。但是,現在我只需要將該總額(卷)僅限於發票數量大於系統中輸入的日期。從同一表中選擇SQL查詢

這裏是我的查詢:

SELECT 
MIN(c.created_at) AS date, 
c.meta_account_Id, 
c.organization_Id, 
c.user_id, 
c.meta_distributorId, 
c.meta_accountName, 
CASE 
    WHEN sum(s.volumece) IS NULL THEN 0 
    ELSE sum(s.volumece) 
END AS ces 
FROM [commitments] c 
LEFT JOIN [Sales2] s ON c.organization_Id=s.org_id AND 
c.meta_account_Id=s.account_id 
WHERE c.status='active' 
GROUP BY c.meta_account_Id, c.organization_Id, c.user_id, 
c.meta_distributorId, c.meta_accountName 

這裏是什麼,我認爲它應該看起來像,但顯然不正確:

SELECT 
MIN(c.created_at) AS date, 
c.meta_account_Id, 
c.organization_Id, 
c.user_id, 
c.meta_distributorId, 
c.meta_accountName, 
CASE 
    WHEN sum(s.volumece) IS NULL THEN 0 
    ELSE (SELECT sum(s.volumece) WHERE s.invoice_date>=c.created_at) 
END AS ces 
FROM [commitments] c 
LEFT JOIN [Sales2] s ON c.organization_Id=s.org_id AND 
c.meta_account_Id=s.account_id 
WHERE c.status='active' 
GROUP BY c.meta_account_Id, c.organization_Id, c.user_id, 
c.meta_distributorId, c.meta_accountName 

基本上[Sales2]是發票和[承諾的表]是在我們的系統中創建的新發票的表格。通過account_id匹配這些數據,然後將所有數據從創建和前進的日期中拉回,在系統中輸入的發票之前沒有發票。

例子:

這一次真的應該總結爲0 CES因爲所有invoice_dates是日期是enetered

Commitments

Sales2

+2

爲什麼不把's.invoice_date> = c.created_at'作爲另一個* join *條件? – Uueerdo

+1

樣本數據和期望的結果將真正幫助您的問題。 –

+0

因爲那麼這個連接會縮小我的結果,我只想縮小這個「ces」的總和。基本上我想保持原樣,說18行項目的結果,然後我想根據發票之後的發票總和縮小最後一個col「ces」 – nickbrleet

回答

1

後,我覺得你的case語句必須在sum()子句中不在它之外。

sum(CASE WHEN s.volumece IS NULL THEN 0 
      when s.invoice_date>=c.created_at then s.volumece 
      else 0 
      end) 

嘗試保持sum(case ...)而不是case when sum()end。合理? Case條款適用於每個卷,而不適用於總合計。

也許不是最優雅的情況下使用空或者有

sum(CASE when s.invoice_date>=c.created_at then coalesce(s.volumece,0) 
      else 0 
      end) 

簡單的?

+0

真棒是的作品像一個魅力。並且也非常感謝你的解釋,這是非常有意義的。 – nickbrleet