2014-03-27 138 views
0

我有以下查詢作爲存儲過程的一部分。它返回關於一個國家的一些指標以及我們在每個國家/地區有多少個位置。這個查詢工作正常。根據子查詢結果篩選器查詢

但是,這會返回所有國家/地區的數據,包括那些沒有位置的國家/地區。我想修改它,以便它只返回CenterCount> 0的記錄,但CenterCount只是子查詢結果的別名,所以我不能只放WHERE CenterCount > 0

我知道我可以通過複製WHEREHAVING子句中的該子查詢來完成此操作,但我不希望在那裏有兩次子查詢。有沒有更好的方法來做到這一點?

SELECT 
    cn.Code as CountryCode, 
    cn.CountryName, 
    ( 
     SELECT COUNT(DISTINCT(CenterID)) 
     FROM Center.Center center 
     JOIN Organization.OrganizationAddress orgAddr 
     ON center.OrganizationID = orgAddr.OrganizationID 
     JOIN Common.Address ca 
     ON orgAddr.AddressID = ca.AddressID 
     AND ca.AddressTypeID = 1 --Physical 
     WHERE ca.CountryID = cn.CountryID 
     AND center.ActiveInd = 1 
     AND ((center.CenterStatusTypeID = 1) OR (center.CenterStatusTypeID = 2 AND center.OpenUTCDate <= DATEADD(DAY, 14, GETUTCDATE()))) 
     AND ca.ActiveInd = 1 
    ) as CenterCount, 
    (
     SELECT COUNT(DISTINCT(SatelliteID)) 
     FROM Center.Satellite sat 
     JOIN Common.Address ca 
     ON sat.AddressID = ca.AddressID 
     WHERE ca.CountryID = cn.CountryID 
     AND sat.ActiveInd = 1 
     AND sat.StatusTypeID = 2 --Approved 
     AND sat.PayerTypeID = 2 --Retail 
     AND sat.WebsitePresenceFlag = 1 
     AND sat.OpenUTCDate <= DATEADD(DAY, 14, GETUTCDATE())  
    ) as SatelliteCount 
    FROM Core.Country cn 
    WHERE (@Country IS NULL OR cn.CountryID = @CountryID) 
    ORDER BY 1 
+0

創建一個'變量'並存儲'CenterCount'的結果並使用該變量! –

+0

將子查詢移動到主查詢的一部分。這樣你就可以使用SQL的全部功能,而不會重複整個事情。 – Odi

回答

1

一個簡單的方法是隻把你的原始查詢到一個公共表表達式,那麼這將允許您使用WHERE CenterCount > 0就像你想要的。

;WITH cte AS 
    (
    SELECT 
    cn.Code as CountryCode, 
    cn.CountryName, 
    ( 
     SELECT COUNT(DISTINCT(CenterID)) 
     FROM Center.Center center 
     JOIN Organization.OrganizationAddress orgAddr 
     ON center.OrganizationID = orgAddr.OrganizationID 
     JOIN Common.Address ca 
     ON orgAddr.AddressID = ca.AddressID 
     AND ca.AddressTypeID = 1 --Physical 
     WHERE ca.CountryID = cn.CountryID 
     AND center.ActiveInd = 1 
     AND ((center.CenterStatusTypeID = 1) OR (center.CenterStatusTypeID = 2 AND center.OpenUTCDate <= DATEADD(DAY, 14, GETUTCDATE()))) 
     AND ca.ActiveInd = 1 
    ) as CenterCount, 
    (
     SELECT COUNT(DISTINCT(SatelliteID)) 
     FROM Center.Satellite sat 
     JOIN Common.Address ca 
     ON sat.AddressID = ca.AddressID 
     WHERE ca.CountryID = cn.CountryID 
     AND sat.ActiveInd = 1 
     AND sat.StatusTypeID = 2 --Approved 
     AND sat.PayerTypeID = 2 --Retail 
     AND sat.WebsitePresenceFlag = 1 
     AND sat.OpenUTCDate <= DATEADD(DAY, 14, GETUTCDATE())  
    ) as SatelliteCount 
    FROM Core.Country cn 
    WHERE (@Country IS NULL OR cn.CountryID = @CountryID) 
) 
    SELECT * 
    FROM cte 
    WHERE CenterCount > 0 
    ORDER BY 1 
+0

很好的回答!這將解決問題。當然,這是SQL Server的具體內容,但對我來說沒問題。 – Jim