查询两个表,对不同的参数分别使用SUM,GROUP和ORDER

时间:2019-01-23 11:40:37

标签: sql tsql

我有2个表PN和FI。 我需要查找特定年份(日期)中的所有产品(id)并求和销售数量(qtt)的总和,但是每个产品(商店)都需要作为1行返回。可以与发出的文档(doc)建立关系。

表1:“ pn”数据示例:

id | date | doc | qtt
---|------|-----|-----
x1 | 2017 | d1  |  1
x2 | 2018 | d2  |  2
x1 | 2018 | d3  |  1
x3 | 2018 | d4  |  1
etc...

表2:“ fi”数据示例:

doc | shop
----|------
d1  |  1
d2  |  1
d3  |  3
d4  |  2
etc...

到目前为止,我能够找到特定年份(日期)中的所有产品(id)并汇总所有已售商品(qtt),但是我无法搜索特定的商店(店)。

这是我所拥有的:

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

感谢您的帮助。 谢谢。

2 个答案:

答案 0 :(得分:0)

请勿在分组依据中使用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

您不需要AND与GROUP BY一起使用。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

答案 1 :(得分:0)

也许您需要最后退出联接。
首先得到总和:

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