下面的代碼獲取包含車輛名稱的表格以及包含區域名稱的表格,並將它們合併到結果表格中。 然後我在結果表上執行一個COUNT來顯示每個區域有多少輛車。強制零出現在計數
我需要修改代碼以強制所有區域和所有車輛進行計數。目前,COUNT語句不顯示任何不包含車輛的區域(我已經手動刪除了結果中的一些條目以顯示此內容)。任何人都可以說明一個快速方法來做到這一點?我使用SQL 2012,希望會有一個簡單的解決方案...
爲了回答這個問題,請假設兩個原始表不再訪問的目的,現在我們只工作與@tbl_results。謝謝。
注:我知道我可以直接從車輛和區域表中做到這一點,但我需要在我的實際工作中使用其他過程的結果表變量。
DECLARE @tbl_vehicles TABLE (vehicleID int, vehicleName nvarchar(100))
DECLARE @tbl_regions TABLE (regionID int, regionName nvarchar(100))
DECLARE @tbl_results TABLE (regionID int, regionName nvarchar(100), vehicleID int, vehicleName nvarchar(100))
INSERT INTO @tbl_regions (regionID, regionName) VALUES (1, 'England')
INSERT INTO @tbl_regions (regionID, regionName) VALUES (2, 'United States')
INSERT INTO @tbl_regions (regionID, regionName) VALUES (3, 'Arctic')
INSERT INTO @tbl_vehicles (vehicleID, vehicleName) VALUES (1, 'Planes')
INSERT INTO @tbl_vehicles (vehicleID, vehicleName) VALUES (2, 'Trains')
INSERT INTO @tbl_vehicles (vehicleID, vehicleName) VALUES (3, 'Automobiles')
DECLARE @i INT
SET @i = 0
WHILE @i < 100
BEGIN
INSERT INTO @tbl_results
(regionID, regionName, vehicleID, vehicleName)
SELECT
r.regionID, r.regionName, v.vehicleID, v.vehicleName
FROM
@tbl_regions r CROSS JOIN
@tbl_vehicles v
WHERE
(r.regionID = CAST(RAND() * 4 AS INT)) AND
(v.vehicleID = CAST(RAND() * 4 AS INT))
SET @i = @i + 1
END
-- remove trains in the arctic for count example
DELETE FROM @tbl_results WHERE (regionID=3) AND (vehicleID=2)
-- this statement needs to include ALL vehicles and ALL regions (even if no vehicles are found at a region)
SELECT
regionName,
vehicleName,
COUNT(*) as VehicleCount
FROM
@tbl_results
GROUP BY
regionID,
regionName,
vehicleID,
vehicleName
ORDER BY regionName, vehicleName
不會'COUNT(*)'弄亂結果嗎?你應該在'@ tbl_results'表的某個列上做點數 – Lamak
@Lamak:你說的沒錯,count(*)'錯誤地返回1,如果沒有找到某個地區的行+車輛組 – Andomar
超級謝謝。我將連接列更改爲ID列(只是爲了消除任何可能的兩個車輛/區域具有相同的名稱,但具有不同的ID)並且它工作良好。 – EvilDr