1

我有一个非常复杂的 SQL 查询(三个 INNER JOINS),它产生了一个易于阅读的结果集,如下所示(简化)。我继承了数据库,因此不可能更改任何现有表的结构,因此我必须执行复杂的查询才能达到这一点:

product_category    |   product_code
------------------------------------
Hardware                102
Hardware                104
Hardware                102
Software                205
Software                104

如果我然后简单地做一个GROUP BYproduct_category、product_code,我会得到我感兴趣的大部分最终结果集:

product_category    |   product_code
------------------------------------
Hardware                102
Hardware                104
Software                205
Software                104

但是,缺少的是库存数量:

product_category    |   product_code    |   num_in_stock
--------------------------------------------------------
Hardware                102                 2
Hardware                104                 1
Software                205                 1
Software                104                 1

由于我希望能够COUNT()直接从GROUP BY语句中完成处理,所以我有点迷茫。

这是迄今为止的 SQL 查询:

SELECT categories.product_category, codes.product_code FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code

表格如下:

  • CATEGORIES- 例如,“硬件”、“软件”
  • CODES- 例如,100、204(属于 a category
  • PRODUCTS- categories+的组合codes,带有无用的版本#
  • STOCK- 产品条目,如果库存超过一个,则有多个条目

因此,之所以如此混乱,是version #因为PRODUCTS. 这意味着对于一个特定的组合(例如,“硬件 102”),它可以PRODUCTS多次输入,每次都有不同的version #值,这将导致STOCK引用不同idsfrom PRODUCTS,即使对我来说,它是同一个产品. 啊!

有任何想法吗?

编辑:

假设有一个产品“Misc 999”有两个不同的版本。这意味着将有一个CATEGORIES“Misc”条目,CODES一个“999”条目(其中一个category_id属于“Misc”),以及两个条目PRODUCTS(两者都具有相同code_id但具有不同的version信息 - 我忽略了) .

然后,如果我们有 10 个库存(一个版本有 3 个,另一个版本有 7 个,但我忽略了版本信息),表中将有 10 个条目STOCK,每个条目将PRODUCTS通过一个id(两个不同的 id,在这种情况下)。

4

2 回答 2

1

尚不完全清楚您想要什么,但也许这可行:

SELECT categories.product_category
     , codes.product_code
     , SUM(num_in_stock) as num_in_stock
FROM (
   SELECT product_id
        , count(*) as num_in_stock 
   FROM stock
   group by product_id
   ) a
INNER JOIN products 
ON a.product_id = products.id
INNER JOIN codes 
ON products.code_id = codes.id
INNER JOIN categories 
ON codes.category_id = categories.id
GROUP BY categories.product_category
       , codes.product_code
于 2013-10-05T19:32:13.530 回答
1

只需添加count(*)到您的选择子句:

SELECT categories.product_category, codes.product_code, count(*) qty_in_stock
FROM stock
INNER JOIN products ON stock.product_id = products.id
INNER JOIN codes ON products.code_id = codes.id
INNER JOIN categories ON codes.category_id = categories.id
GROUP BY categories.product_category, codes.product_code

SQLFiddle在这里

于 2013-10-05T19:39:37.883 回答