使用具有相同值的多行的表

时间:2016-12-02 10:31:37

标签: sql sql-server

我试图做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

预期结果:

?.

3 个答案:

答案 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 这个骄傲的领域应该成为一个主要的关键。