加入2表错误

时间:2016-01-13 07:56:03

标签: sql join left-join inner-join

我试图加入2个表来获取输出报告。涉及的表格是库存和日常销售表。

股票和每日销售表:

enter image description here

所需的输出格式:

enter image description here

我正在尝试使用以下查询加入2个表

Select item,article,sold,stockonhand
from stock S
left join dailysales as D on S.item=D.item
group by item

我希望输出包含stock表中的所有行。就像有股票,但没有卖出,也包括在报告中。目前我的报告没有显示,(库存但未售出)。

希望您能理解我的背景或指向我可以阅读的教程。我试着搜索了几天,但找不到一个确切的问题。

3 个答案:

答案 0 :(得分:2)

未经测试 -

select item,article,sum(sold),sum(stockonhand)-sum(sold) from (
 select a.item,a.article,a.stockonhand,case when b.sold is null then 0 else b.sold end as sold 
 from stock a left join dailysales b on (a.item = b.item))
group by item,article;

它基本上是左连接并在空列上放0(对于后面的总和) 然后将select中所有列的结果分组总结(你的查询有什么问题)

答案 1 :(得分:1)

只需LEFT JOIN两张桌子(也可以获得长笛),执行GROUP BYSUM售出:

select s.item, s.article, coalesce(SUM(d.sold),0) as "qty sold", s.stockonhand
from stock S
left join dailysales as D on S.item=D.item
group by s.item, s.article, s.stockonhand

对于未售出的商品,coalesce可以将NULL替换为0。 (谢谢sagi!)

常规GROUP BY提示:如果指定了GROUP BY子句,则SELECT列表中的每个列引用都必须标识分组列或者是set函数的参数。

此外,您可以从article表中删除dailysales列。该数据已存储在stock表中。从不存储两次相同的数据! (规范化!)如果保留该列,则存在数据不一致的风险。

答案 2 :(得分:0)

您可以在分隔的表格中对项目求和,它会比GROUP BY 2个表格更清晰

SELECT 
    s.item, 
    s.article, 
    ISNULL(ds.sold, 0) AS qtysold, 
    s.stockonhand
FROM 
    stock s OUTER APPLY 
    (SELECT SUM(sold) AS sold FROM dailysales WHERE item = s.item GROUP BY item) ds