SQL Join根据查询结果进行计数

时间:2015-10-03 19:54:29

标签: sql join

我开始试图根据查询结果计算一个表中的记录。我的表看起来像这样:

$ curl --silent --location -cookie "$COOKIE" --cookie-jar "$COOKIE" \
--data 'username=xxx' --data-urlencode "password@passwd" 'http://example.com'

首先,我创建了一个查询,以便在与状态(描述)相同的行中为我提供公司名称。我的初步查询是:

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

到目前为止一切顺利。但是,我想要做的是计算每个 site_id ORDERS 表中的订单数量,即使订单数量为0。

我根据查询结果难以理解如何根据 ORDERS 表进行计数?任何有关此加入的帮助将不胜感激。

更新:几乎就在那里!这是有效的:

Company_A     FL    1
Company_A     DE    2

我留下的唯一问题是,如果我添加日期范围,我会得到正确的结果,但是没有显示任何具有该期间零订单的网站。所以,如果我添加:

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

我得到了正确的结果,但仅适用于在此期间有订单的网站。我错过了什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您可以使用LEFT Join轻松解决此问题,然后计算订单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 

您没有描述您的订单表,因此我猜测加入条件