我试图做INNER JOIN
并使用两个表中的信息计算值。问题是产品类别表有多个具有相同或相似值的行,因此我COUNT()
为高。
我的两张桌子
销售表
Date prod_id
2016-01-01 81
2016-01-01 82
2016-01-01 81
2016-10-01 80
2016-01-01 80
2016-01-02 80
2016-01-02 80
2016-01-02 81
2016-01-02 81
.... ....
产品表
prodid Name
80 Banana
81 Apple
82 Orange
83 Ice Cream
80 BANANAS
81 APPLE
82
83 Ice Cream
.... ....
当我执行INNER JOIN
并计算例如prod_id
的出现次数时prod_id
我得到了一个不合理的高数字,我的猜测是,因为例如Procuct
80出现了不止一次。
您对解决方案有什么想法吗?我的第一反应是重做 SELECT
pt.Date AS "Date",
ft.Name AS "Product",
COUNT(ft.Name) Number
FROM SALES as pt
INNER JOIN PROD_TABLE AS ft ON pt.prod_id=ft.prodid
WHERE pt.Date BETWEEN '2016-01-01' AND '2016-01-30'
GROUP BY pt.Date, ft.Name
ORDER BY pt.Date DESC
表,但还有许多其他系统取决于该表,所以我无法在可预见的未来改变它。
到目前为止我的查询:
Date Product Number
2016-01-01 Banana 2
2016-01-01 Apple 2
2016-01-01 Orange 1
预期结果:
?.
答案 0 :(得分:0)
首先,您应该修复数据。拥有重复的产品表似乎是非感性的。你不应该通过编写更复杂的查询来解决这些问题。
也就是说,这在SQL Server中很容易实现。我认为outer apply
是合适的:
select p.name, count(*)
from sales s outer apply (
(select top 1 p.*
from product p
where p.name is not null and
p.prodid = s.prod_id -- note: the columns should have the same name
) p;
答案 1 :(得分:0)
我想这个简单的查询可以解决您的要求:
select
date,
name,
count(name)
from product p inner join sales s
on s.prod_id=p.prodid group by date,name
答案 2 :(得分:0)
简单地用子查询替换PROD_TABLE,该子查询为您提供唯一的prodid和名称:
SELECT
pt.Date,
ft.Name AS "Product",
COUNT(*) AS Number
FROM SALES as pt
LEFT JOIN (
select prodid, min(Name) PROD_TABLE group by prodid
) AS ft ON (pt.prod_id = ft.prodid)
WHERE pt.Date BETWEEN '2016-01-01' AND '2016-01-30'
GROUP BY pt.Date, ft.Name
ORDER BY pt.Date DESC
但是i.m.h.o.真的应该清理PROD_TABLE 这个骄傲的领域应该成为一个主要的关键。