2015-11-27 63 views
1

我想要得到的結果只對那些COUNT這是> = 3SQL-服務器:返回領域,其中COUNT(*)大於或等於3

SELECT CustomerNBene.Company, ContractLog.userID 
     , CONVERT (varchar(10) ,ContractLog.date, 103) as [date] 
     , CONVERT (varchar(10), ContractLog.LValueDate, 103) as LValueDate 
     , Payable.ContractNo 
     , Payable.bank 
     , Payable.currency 
     , Payable.Amount 
     , (
      SELECT Count(*) 
      FROM DimDate 
      WHERE DimDate.[Date] BETWEEN CONVERT (varchar(10) ,ContractLog.[date], 112) 
      AND CONVERT (varchar(10), ContractLog.LValueDate, 112) AND DimDate.isweekEND = 0 
     ) as Payable 
FROM CustomerNBene, ContractLog, Payable 
WHERE ContractLog.contractNo = Payable.ContractNo 
AND ContractLog.LConStatus = 'VAL' 
AND CustomerNBene.ConNo = ContractLog.contractNo 
AND CustomerNBene.CustID != '01' 
AND (Payable.Confirmed is NULL or Payable.Confirmed = 'N') 
ORDER BY Payable desc, bank 

當我添加AND Payable >= 3,我得到「無效列名「

我該如何去做呢?

+0

應付這裏的範圍是列於選擇一個別名聲明,所以你不能把它放在WHERE –

回答

0

解決方法是使用temptable,將上述查詢的結果集插入到temptable中,然後將過濾器應用於臨時表。

試試這個..

SELECT CustomerNBene.Company, ContractLog.userID 
     , CONVERT (varchar(10) ,ContractLog.date, 103) as [date] 
     , CONVERT (varchar(10), ContractLog.LValueDate, 103) as LValueDate 
     , Payable.ContractNo 
     , Payable.bank 
     , Payable.currency 
     , Payable.Amount 
     , (
      SELECT Count(*) 
      FROM DimDate 
      WHERE DimDate.[Date] BETWEEN CONVERT (varchar(10) ,ContractLog.[date], 112) 
      AND CONVERT (varchar(10), ContractLog.LValueDate, 112) AND DimDate.isweekEND = 0 
     ) as Payable 
INTO #TempTable -->> Insert into temp table 
FROM CustomerNBene, ContractLog, Payable 
WHERE ContractLog.contractNo = Payable.ContractNo 
AND ContractLog.LConStatus = 'VAL' 
AND CustomerNBene.ConNo = ContractLog.contractNo 
AND CustomerNBene.CustID != '01' 
AND (Payable.Confirmed is NULL or Payable.Confirmed = 'N') 
ORDER BY Payable desc, bank 

-->> now apply the filtering in temp table 
SELECT Company, userID, date, LValueDate, ContractNo, bank, currency, Amount, Payable 
FROM #TempTable 
GROUP BY Company, userID, date, LValueDate, ContractNo, bank, currency, Amount, Payable 
HAVING COUNT([Payable]) >= 3 
0

你需要知道其中的查詢語句執行的邏輯順序,你可以從下面的鏈接下載海報,並按照數字來查看哪些運營商執行下一

http://tsql.solidq.com/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf

簡單來說

下面的查詢不會工作

select name,sum(id) as summ 
from test 
where summ=10 

您可以在cte.CTE包裹它是不是在DB物化一個disposbale視圖,但有效期爲單次執行

;with cte 
as 
(
select name,sum(id) as summ 
from test 
where summ=10 
) 
select * from cte where summ=10