从左表返回所有数据

Icy*_*rts 2 sql-server t-sql sql-server-2008-r2

我的左表比右表包含更多的商店名称。我以为快速左连接会返回该数据集,但无济于事!

Data In From 子句有最多的选项,我想显示所有这些 Data In Left Join 子句有一些但不是我想显示的所有选项

我创建了 CTE 来获取 SUM() 并将数据拉到主查询中存在于左连接表中

这是我使用的查询,它没有给出我想要的结果。

;With DataFromOne As
(
    Select   StoreName
             ,DataFromOne = Count(ramalad)
    FROM     DataFromOne
    WHERE    EntryDate BETWEEN '20170101' AND '20170331'
    GROUP BY StoreName
)
Select   ec.StoreName
         ,[Emp Count] = COUNT(Employee)
         ,[PT Count] = COALESCE(ec.DataFromOne,0)
FROM     DataFromOne ec
LEFT OUTER JOIN DataFromTwo fji
ON       ec.StoreName = fji.StoreName
WHERE    fji.saleDate BETWEEN '20170101' AND '20170331'
GROUP BY ec.StoreName, ec.DataFromOne
ORDER BY ec.StoreName ASC;
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 9

如果在右表上添加过滤器,则可以有效地将外连接转换为内连接。

将日期过滤器从 WHERE 移至 ON。

另外我建议一个开放式范围而不是 BETWEEN。

最后,我建议不要将 CTE 命名为与基表相同的名称(这会造成混淆),使用正确的架构引用,并以分号结尾。

这是一个开始:

;With ec As
(
    Select
      StoreName
      ,DataFromOne = Count(ramalad)
    FROM dbo.DataFromOne
    WHERE EntryDate >= '20170101' 
       AND EntryDate < '20170401'
   GROUP BY StoreName
)
Select 
  ec.StoreName
  ,[Emp Count] = COUNT(fji.Employee)
  ,[PT Count] =      COALESCE(ec.DataFromOne,0)
FROM ec
LEFT OUTER JOIN dbo.DataFromTwo AS fji
   ON ec.StoreName = fji.StoreName
   AND fji.SaleDate >= '20170101'
   AND fji.SaleDate <  '20170401'
GROUP BY ec.StoreName, ec.DataFromOne
ORDER BY ec.StoreName;
Run Code Online (Sandbox Code Playgroud)

事实上,您可以大大简化查询逻辑(尽管我不确定这将如何改变您的计划):

SELECT 
  ec.StoreName,
  [Emp Count] = COUNT(fji.Employee),
  [PT Count]  = COUNT(ec.ramalad)
FROM dbo.DataFromOne AS ec
LEFT OUTER JOIN dbo.DataFromTwo AS fji
   ON ec.StoreName = fji.StoreName
   AND fji.SaleDate >= '20170101'
   AND fji.SaleDate <  '20170401'
WHERE ec.EntryDate >=  '20170101' 
  AND ec.EntryDate <   '20170401'
GROUP BY ec.StoreName
ORDER BY ec.StoreName;
Run Code Online (Sandbox Code Playgroud)