我有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
感谢您的帮助。 谢谢。
答案 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