0

我有以下 4 个表:

----------
tblDates:

DateID

30/04/2012
01/05/2012
02/05/2012
03/05/2012

----------
tblGroups:

GroupID
Home
Table

----------
tblProducts:

ProductID   GroupID
Chair       Home
Fork        Table
Knife       Table
Sofa        Home

----------
tblInventory:

DateID      ProductID   Quantity

01/05/2012  Chair       2
01/05/2012  Sofa        1
01/05/2012  Fork        10
01/05/2012  Knife       10
02/05/2012  Sofa        1
02/05/2012  Chair       3
03/05/2012  Sofa        2
03/05/2012  Chair       3

我正在尝试编写一个查询,该查询返回 tblDates 中的所有 Dates 、tblGroups的所有GroupID以及每个GroupID中的项目总数。

我设法做到这一点,但仅get Sum(Quantity)适用于不为空的GroupIDDateID。我想得到0。例如上面的数据,我想得到一条线"02/05/2012 Table 0",因为在“表”组中没有任何产品的数据01/05/12

到目前为止,我的 SQL 查询是:

SELECT tblDates.DateID, 
       tblProducts.GroupID, 
       Sum(tblInventory.Quantity) AS SumOfQuantity
FROM (tblGroup 
     INNER JOIN tblProducts ON tblGroup.GroupID = tblProducts.GroupID) 
     INNER JOIN (tblDates INNER JOIN tblInventory ON tblDates.DateID = tblInventory.DateID) ON tblProducts.ProductID = tblInventory.ProductID
GROUP BY tblDates.DateID, tblProducts.GroupID;

我认为我应该基本上在与tblInventory不同的表上具有相同的查询,该查询将列出所有产品而不是列出的产品,其中 0 而不是没有行,但鉴于我的数据库中的日期产品数量,我犹豫是否这样做,查询可能太慢了。

可能有更好的方法来实现这一点。

谢谢

4

3 回答 3

2

要获得所有可能的Groups组合Dates,您必须使用CROSS JOIN这些表格。然后你可以LEFT JOIN到其他 2 个表:

SELECT
    g.GroupID
  , d.DateID
  , COALESCE(SUM(i.Quantity), 0)  AS Quantity
FROM 
        tblDates  AS d
    CROSS JOIN
        tblGroups AS g
    LEFT JOIN
            tblProducts  AS p
        JOIN
            tblInventory AS i
          ON i.ProductID = p.ProductID 
      ON  p.GroupID = g.GroupID
      AND i.DateID = d.DateID 
GROUP BY
    g.GroupID
  , d.DateID
于 2012-05-03T11:20:58.607 回答
0

使用 isnull() 函数。将您的查询更改为:

    SELECT tblDates.DateID, tblProducts.GroupID,
            **ISNULL( Sum(tblInventory.Quantity),0)** AS SumOfQuantity
    FROM (tblGroup INNER JOIN tblProducts ON tblGroup.GroupID = tblProducts.GroupID) 
    INNER JOIN (tblDates INNER JOIN tblInventory ON tblDates.DateID = tblInventory.DateID)
            ON tblProducts.ProductID =  tblInventory.ProductID
    GROUP BY tblDates.DateID, tblProducts.GroupID;
于 2012-05-03T11:07:22.573 回答
0

您没有说您使用的是哪个数据库,但我熟悉的是 Oracle。

显然,如果您内部连接所有 tbales,您将不会获得包含空值的行。如果您使用外连接到库存表,您也会遇到问题,因为 groupid 列未列在 tblinventory 中,您只能外连接到一个表。

我会说你有两个选择。使用函数或在库存表中具有 groupid 列的副本。

所以,一个更好但更慢的解决方案:

create or replace
function totalquantity( d date, g varchar2 ) return number as
  result number;
begin
  select nvl(sum(quantity), 0 )
  into result
  from tblinventory i, tblproducts p
  where i.productid = p.productid
  and i.dateid = d
  and p.groupid = g;
  return result;
end;

select dateid, groupid, totalquantity( dateid, groupid )
from tbldates, tblgroups

或者,如果您在库存表中包含 groupid 列。(您仍然可以使用约束来保证完整性)

select d.dateid, i.groupid, nvl(i.quantity, 0) 
from tbldates d, tblinventory i 
where i.dateid(+) = d.dateid 
group by d.dateid, g.groupid 

希望这会有所帮助,吉斯利

于 2012-05-03T11:38:22.807 回答