2016-01-22 60 views
0

對於我的生活,我無法弄清楚如何在我的行中獲得0計數。分配計數爲0到沒有數據的行

我有2個非常簡單,設計很差的表,就像下面的表一樣。

不幸的是,我無法改變它們,只需要與它們合作。

IF OBJECT_ID('tempdb.dbo.#CityList') IS NOT NULL 
    DROP TABLE #CityList 
CREATE TABLE #CityList (CityName varchar(255) PRIMARY KEY) 
INSERT INTO #CityList VALUES ('New York City'), ('Cairo'), ('London'), ('Tokyo') 


IF OBJECT_ID('tempdb.dbo.#A_LogFile') IS NOT NULL 
    DROP TABLE #A_LogFile 
CREATE TABLE #A_LogFile(PersonName varchar(255), CityName varchar(255)) 
INSERT INTO #A_LogFile VALUES 
    ('Joe', 'New York City'), ('Tim', 'Cairo'), ('Nancy','London'), ('Bilbo','Tokyo'), 
    ('Joe', 'New York City'), ('Tim', 'Cairo'), ('Nancy','Tokyo'), ('Bilbo','New York City'), 
    ('Joe', 'Cairo'), ('Tim', 'Cairo'), ('Nancy','Cairo'), ('Bilbo','Tokyo'), 
    ('Joe', 'New York City'), ('Tim', 'Cairo'), ('Nancy','New York City'), ('Bilbo','Tokyo') 

我用盡各種查詢像這樣的:

select l.PersonName, cl.CityName, COUNT(l.cityName) AS 'Total Visits' 
from #CityList cl 
left join #A_LogFile l on cl.CityName = l.CityName 
group by l.PersonName, cl.CityName 
order by PersonName, CityName 

但我永遠無法得到的0

我需要每個人有每個城市的行數,計數即使該行不存在於#A_LogFile表中。

基本上,我需要的結果看起來像這樣(爲上述樣本數據):

Bilbo | Cairo   | 0 
Bilbo | London   | 0 
Bilbo | New York City | 1 
Bilbo | Tokyo   | 3 
Joe  | Cario   | 1 
Joe  | London   | 0 
Joe  | New York City | 3 
Joe  | Tokyo   | 0 
Nancy | Cairo   | 1 
Nancy | London   | 1 
Nancy | New York City | 1 
Nancy | Tokyo   | 1 
Tim  | Cairo   | 4 
Tim  | London   | 0 
Tim  | New York City | 0 
Tim  | Tokyo   | 0 

謝謝!

+0

這個由l.PersonName – Paparazzi

+0

打破左側組@Frisbee如果採取PERSONNAME本集團通過對,然後我得到一個錯誤。 – SkyeBoniwell

回答

3

您可以穿越加入citylist到不同PERSONNAME在CTE和使用,從您的左加入日誌文件

WITH cte 
AS (
    SELECT * 
    FROM (SELECT CityName FROM #CityList) cl, 
      (SELECT DISTINCT PersonName FROM #A_LogFile) pn 
    ) 
SELECT cte.PersonName, 
     cte.CityName, 
     COUNT(lf.cityName) AS 'Total Visits' 
FROM cte 
     LEFT JOIN #A_LogFile lf ON cte.CityName = lf.CityName 
            AND cte.PersonName = lf.PersonName 
GROUP BY cte.PersonName, 
     cte.CityName 
1
select l1.PersonName, cl.cityName, COUNT(l2.CityName) AS 'Total Visits' 
    from  #A_LogFile l1 
cross join #CityList cl 
    left join #A_LogFile l2 
     on l2.CityName = cl.cityName 
     and l2.PersonName = l1.PersonName 
group by l1.PersonName, cl.cityName 
order by l1.PersonName, cl.cityName 
+0

它不是我,但在光明的一面,你確實得到了一個投票:) – JamieD77

1

您需要派生的人不同的列表,然後交叉連接的是反對你的城市名單,最後離開你的LogFile加入計數。

select people.PersonName, cl.CityName, COUNT(l2.cityName) AS 'Total Visits' 
    from (select distinct l.PersonName from #A_LogFile l) people 
     cross join #CityList cl 
     left join #A_LogFile l2 
      on people.PersonName = l2.PersonName 
       and cl.CityName = l2.CityName 
    group by people.PersonName, cl.CityName 
    order by PersonName, CityName; 
1

如果你堅持使用舊版本的SQL不具有CTE功能,您還可以使用交叉適用於每個城市的每一個人,然後一個子查詢地圖,讓數:

SELECT l.PersonName, cl.CityName, COALESCE((SELECT COUNT(1) FROM #CityList cl2 LEFT JOIN #A_LogFile l2 ON cl2.CityName = l2.CityName WHERE cl2.cityName = cl.CityName AND l2.PersonName = l.PersonName GROUP BY l2.PersonName, cl2.CityName ), 0) AS 'Total Visits' FROM #A_LogFile l CROSS APPLY #CityList cl GROUP BY l.PersonName, cl.CityName ORDER BY PersonName, CityName

相關問題