2015-10-03 30 views
1

我正在試圖根據查詢結果計算一個表中的記錄。我的表如下所示:SQL根據查詢結果加入以加入算數

parent_id | site_id | description 
----------------------------------- 
A1   1   FL 
A1   2   NJ 
A1   A1   Company_A 

首先,我創建了一個查詢,爲我在與狀態(說明)相同的行上提供公司名稱。我最初的查詢是:

SELECT master.description, sites.description, sites.site_id 
FROM sites sites 
INNER JOIN sites master 
    ON sites.parent_id = master.site_id 

,這導致:

Company_A  FL 1 
Company_A  DE 2 

到目前爲止好。我想要做什麼,雖然是從訂單表中的每個SITE_ID計算的訂單數量,即使在訂單數量爲0

我難倒如何從數ORDERS表根據我的查詢結果?任何幫助這個加入將不勝感激。

更新:幾乎在那裏!這裏是正在工作:

SELECT master.description, sites.description, count(order_id) orderCount 
FROM sites sites 
INNER JOIN sites master 
ON sites.parent_id = master.site_id 
LEFT JOIN orders o 
ON sites.site_id = o.site_id 
WHERE sites.site_type = 3 
GROUP BY master.description, sites.description, sites.site_id 
ORDER BY master.description 

我留下的唯一問題是,如果我添加日期範圍內我得到正確的結果,但任何網站以零個訂單那段不顯示。所以,如果我添加:

WHERE sites.site_type = 3 AND o.order_date > '2015-10' 

我得到正確的結果,但只有在該期間有訂單的網站。我錯過了什麼?

+0

能否請您添加描述(或優選地,DDL)猜測? – Mureinik

回答

1

就可以解決這個用左很容易地加入,然後在訂單ID的計數。重要的是不要計數行count(*),因爲即使沒有訂單,該行也會返回值1

此外,訂單表上的任何篩選都需要在JOIN內完成。

SELECT master.description, sites.description, sites.site_id 
     ,count(order_id) order_count 
FROM sites sites 
INNER JOIN sites master 
    ON sites.parent_id = master.site_id 
LEFT JOIN orders o 
ON master.site_id = o.Site_id 
    and o.order_date > '2015-10' 
WHERE 
     sites.site_type = 3 
GROUP by 
master.description, sites.description, sites.site_id 

你沒有描述您的訂單表,所以我在`orders`表的連接標準

+0

謝謝@ConradFrix - 我使用了你的解決方案,並且快到了。不過,我添加了一個日期範圍(請參閱原始文章中的更新),並且在此期間我沒有收到零結果的結果。有任何想法嗎? –

+0

@StephenDundas左連接右側的任何篩選都會將連接轉換爲內連接。只需將'o.order_date>'2015-10'移至連接子句,例如on'ON master.site_id = o.Site_id和o.order_date>'2015-10',它會修復它 –

1

這應該符合您的期望:

SELECT master.description, sites.description, sites.site_id, 
ISNULL((SELECT COUNT(*) FROM Orders o where master.siteId = o.siteId),0) as ordersCount 
FROM sites sites 
INNER JOIN sites master 
    ON sites.parent_id = master.site_id