2016-02-13 39 views
1
SELECT 
    Monitor_Summary.Company_id AS CompanyId, 
    Monitor_Summary.Company_Name, 
    COUNT(1) AS Total, 
    (SELECT COUNT(1) 
    FROM MONITOR 
    WHERE ISNULL(MONITOR.IPWarning_ind, 0) = 1 
     AND MONITOR.Company_id = Monitor_Summary.Company_ID 
     AND MONITOR.Status_ind NOT IN (1,0)) AS NewWarnings  
FROM 
    Monitor_Summary 
GROUP BY 
    Monitor_Summary.Company_id, Monitor_Summary.Company_Name 
HAVING 
    COUNT(1) > 2 AND NewWarnings > 1 

我想只選擇有多個NewWarnings的行。我收到一個錯誤,說無效列,不知道如何解決這個問題。堅持一個變量用在SQL Server中的having子句中

謝謝,

回答

2

你需要把你的基本查詢子查詢或CTE這樣你可以參考NewWarnings列裏:

;WITH CTE AS 
(
    SELECT 
     Monitor_Summary.Company_id AS CompanyId, 
     Monitor_Summary.Company_Name, 
     COUNT(1) AS Total, 
     (SELECT COUNT(1) 
     FROM MONITOR 
     WHERE ISNULL(MONITOR.IPWarning_ind, 0) = 1 
      AND MONITOR.Company_id = Monitor_Summary.Company_ID 
      AND MONITOR.Status_ind NOT IN (1,0)) AS NewWarnings  
    FROM 
     Monitor_Summary 
    GROUP BY 
     Monitor_Summary.Company_id, Monitor_Summary.Company_Name 
) 
SELECT 
    CompanyId, 
    Company_Name, 
    Total, 
    NewWarnings  
FROM 
    CTE 
WHERE 
    Total > 2 AND NewWarnings > 1 
0

SELECT評價HAVING已經被執行之後才。因此,您不能在HAVING條款中使用NewWarnings

之一來解決此問題的方法,是實現使用CROSS APPLYSELECT條款的相關子查詢:

SELECT Monitor_Summary.Company_id AS CompanyId, 
     Monitor_Summary.Company_Name, 
     COUNT(1) AS Total, 
     x.NewWarnings 
FROM Monitor_Summary 
CROSS APPLY (
    SELECT COUNT(1) 
    FROM MONITOR 
    WHERE ISNULL(MONITOR.IPWarning_ind, 0) = 1 
     AND MONITOR.Company_id = Monitor_Summary.Company_ID 
     AND MONITOR.Status_ind NOT IN (1,0) 
) AS x(NewWarnings) 
WHERE x.NewWarnings > 1 
GROUP BY Monitor_Summary.Company_id,Monitor_Summary.Company_Name 
HAVING COUNT(1) > 2 

這樣你就可以查詢的WHERE子句中使用NewWarnings領域。