2016-02-13 86 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领域。