【问题标题】:SQL query LEFT JOINSQL查询左联接
【发布时间】:2013-07-08 14:59:46
【问题描述】:

好的...由于某种原因,我总是在 SQL 中遇到左连接问题。

我有一个简单的查询

SELECT COUNT(*) as OpenedToday, c.Product_Line, c.Product_Code
FROM SFCase as c
LEFT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p ON p.Product_Code = c.Product_Code
WHERE IsClosed = 'false'
AND DATEPART(YEAR, GETDATE()) = DATEPART(YEAR, CreatedDate)
AND DATEPART(MONTH, GETDATE()) = DATEPART(MONTH, CreatedDate)
AND DATEPART(DAY, GETDATE()) = DATEPART(DAY, CreatedDate)
GROUP BY c.Product_Line, c.Product_Code

我期望的是所有 Product_Code 的列表,其中包含了 OpenedToday 的数量(包括零值)。相反,我只得到了今天开箱的那些产品代码的列表(只有正值)。

当我只运行 DISTINCT Product_Code 时,我得到 70 个结果显示。但是,运行完整的查询,我今天只得到 4 个。我想查看全部 70 条结果,如果今天没有开立任何案例,则为零。

我对这个加入做错了什么?

查理

【问题讨论】:

  • SFCase 是否只保留今天打开的案例?如果没有,您如何判断今天打开了哪些案例 - 例如,是否有打开日期?您有单独的桌子来存放所有产品吗?
  • 你做的正好相反。使用右外连接
  • 马克 - 实际上,我的真实查询有更多...我试图为论坛简化它。我已经更新了问题以显示完整的查询...我只是检查 CreatedDate 字段以判断它今天是否打开。

标签: sql join left-join


【解决方案1】:

试试:

SELECT SUM(CASE WHEN IsClosed='false' AND DATEDIFF(DAY, GETDATE(), CreatedDate)=0 
                THEN 1 ELSE 0 END) as OpenedToday, 
       Product_Line, Product_Code
FROM SFCase
GROUP BY Product_Line, Product_Code

【讨论】:

  • 很好,谢谢马克。这就是诀窍。我需要花一点时间才能理解……绝对是一种与我尝试的方法不同的方法,但这似乎给了我我正在寻找的东西。非常感谢!
  • 好的...阅读完 CASE 声明后...这很有意义。我喜欢这种方法......实际上我认为它可能会帮助我解决我正在尝试管理的一些我继承的其他查询。我也许可以简化它们,以便我可以实际管理它们哈哈。
  • @Charlie74:很高兴我能帮上忙。
【解决方案2】:
SELECT  p.Product_Line, p.Product_Code,COUNT(*) as OpenedToday
FROM SFCase as c
RIGHT OUTER JOIN (SELECT DISTINCT Product_Code from SFCase) as p 
ON p.Product_Code = c.Product_Code
GROUP BY p.Product_Line, p.Product_Code

【讨论】:

  • 不幸的是,这与我得到的结果相同。
猜你喜欢
  • 2021-12-25
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多