Sql 查询两个表,其中包含不同参数的和、组和顺序

Sql 查询两个表,其中包含不同参数的和、组和顺序,sql,tsql,Sql,Tsql,我有两张桌子PN和FI。 我需要查找特定年份(日期)的所有产品(id)并合计销售数量(qtt),但每个产品需要作为每个商店(商店)的一行返回。可以与发出的单据建立关联 表1:“pn”数据样本: id | date | doc | qtt ---|------|-----|----- x1 | 2017 | d1 | 1 x2 | 2018 | d2 | 2 x1 | 2018 | d3 | 1 x3 | 2018 | d4 | 1 etc... doc | shop ----|

我有两张桌子PN和FI。 我需要查找特定年份(日期)的所有产品(id)并合计销售数量(qtt),但每个产品需要作为每个商店(商店)的一行返回。可以与发出的单据建立关联

表1:“pn”数据样本:

id | date | doc | qtt
---|------|-----|-----
x1 | 2017 | d1  |  1
x2 | 2018 | d2  |  2
x1 | 2018 | d3  |  1
x3 | 2018 | d4  |  1
etc...
doc | shop
----|------
d1  |  1
d2  |  1
d3  |  3
d4  |  2
etc...
表2:“fi”数据样本:

id | date | doc | qtt
---|------|-----|-----
x1 | 2017 | d1  |  1
x2 | 2018 | d2  |  2
x1 | 2018 | d3  |  1
x3 | 2018 | d4  |  1
etc...
doc | shop
----|------
d1  |  1
d2  |  1
d3  |  3
d4  |  2
etc...
到目前为止,我能够找到特定年份(日期)的所有产品(id)和所有售出商品(qtt)的总和,但我无法搜索特定的商店(Shop)

以下是我所拥有的:

SELECT id, SUM(qtt) AS Qtd
FROM pn
WHERE
   year(date)='2018'
ORDER BY Qtd
结果:

id | Qtd
---|----
x1 | 10
x2 | 22
x3 | 45
etc...
当我想要得到的是:

id | Qtd | WhareHouse
---|-----|-----------
x1 |   6 |     1
x1 |   4 |     2
x2 |  20 |     1
x2 |   2 |     2
x3 |  35 |     1
x3 |  10 |     2
etc...
我尝试过,但运气不佳:

SELECT 
   pn.id,
   SUM(pn.qtt) AS Qtd,
   pn.date,
   fi.shop
FROM pn
LEFT JOIN fi ON fi.doc = pn.doc
WHERE
   year(pn.date)='2018' AND
GROUP BY fi.shop, pn.date, pn.qtt, pn.id
ORDER BY Qtd
感谢您的帮助。
谢谢。

您不应该在组中使用qtt,否则总和将失败

SELECT 
   pn.id,
   SUM(pn.qtt) AS Qtd,
   pn.date,
   fi.shop
FROM pn
LEFT JOIN fi ON fi.doc = pn.doc
WHERE  year(pn.date)='2018' 
GROUP BY fi.shop, pn.date,  pn.id
ORDER BY Qtd
你不需要和小组成员一起。。GROUP BY是一个不同的条款,在何处受尊重,且不得在何处受约束

根据你的评论,你应该加入总数

SELECT 
   t.id,
   t.Qtd,
   t.date,
   fi.shop
FROM (
    select pn.id,
       SUM(pn.qtt) AS Qtd,
       pn.date,
       pn.doc
    from pn 
    group by pn.date,  pn.id, pn.doc 
) t 
LEFT JOIN fi ON fi.doc = pn.doc 
WHERE  year(t.date)='2018' 
ORDER BY t.Qtd

也许你需要最后离开加入。
首先得到总数:

select p.id, p.Qtd, fi.shop from (
  select 
    pn.id, 
    pn.doc, 
    sum(pn.qtt) / 
    (select count(*) from pn p 
     where p.doc = pn.doc and year(p.date) = year(pn.date) and p.id = pn.id) as Qtd
  from pn
  where year(pn.date) = '2018'
   group by pn.id, pn.doc
) as p inner join fi
on fi.doc = p.doc 

更新您的问题并添加一个连贯的数据样本(不仅仅是结果)我编辑了帖子并进行了所需的更改,目的是关闭您不清楚的问题。我正在寻求帮助,了解如何创建一个查询,返回特定年份内每个商店售出的所有商品,因为我必须对isue(公司政策)做一个完全新的解释,所以我不会回答这个问题。因此,我想删除它,因为它会导致更多的混乱,然后回答。感谢所有帮助过我的人。。。特别感谢福帕斯。我把你的密码改成:。。。。。其中年份(生产日期)=2018年,fi.shop=2,生产日期='IFPLS933'。。。。这样,我在一家商店只检查一种产品。这个特定的项目,在那个特定的年份和商店给我一个结果4571出售的项目,它应该只有125。。。有什么线索导致这种情况吗?在试图找出奇怪结果的原因时,我删除了GROUP BY和ORDER BY,以获得2018年2号店该商品的所有结果。由于某种原因,它在ramdom数学中多次返回相同的行。您应该添加一个连贯的数据样本。。因为根据您的示例,查询应该是正确的。。但是我们无法知道您的真实数据内容..数据库有数十万个条目,并且呈现的表是真实表的简化版本。。。因为他们有很多田地。我该如何展示样品?嗨!谢谢你的意见。你的代码运行得很好,但我遇到了与其他建议相同的问题。每个项目的每个总和都返回巨大的值。例如,一个售出125次的商品返回4571次,而另一个只有1次售出的商品返回78次。SUM函数将添加列
qtt
的所有值。这就是你得到的结果。这没有错。难道你不想对这些值求和吗?也许你应该发布更多的样本数据和预期结果,因为我怀疑你没有澄清你需要什么。谢谢你的努力,但我必须使用Sum。在一行中,超过1个项目可以出售,因此我必须总和,共谋。让我毛骨悚然的是,如果我使用我在开篇文章中展示的1º代码,每件商品我都会得到它的总销售额(所有商店的总数)。但只要我查询2º表。。。所有的地狱刹车都松了,价值观也没有意义了。不幸的是。。。同样的结果。在几次测试查询之后,我发现创建了一些可笑的值,因为它在完全随机的情况下多次将相同的行相加(尽管总是给出相同的结果)。是否有方法删除(或防止)要添加的重复行?可能会比较“doc”,因为它是每个事务的唯一值。不存在重复添加相同行的情况。它是对现有行的求和。那么也许你有重复的行?