2013-10-24 30 views
0

我試圖執行Select語句,其中包含來自數據庫的多個表,並且其中包含計算的計數列。我有問題添加另一個計算列,我想使用CASE聲明。在sql select語句中使用CASE的計數

我的代碼如下:返回

SELECT  
    Customers.FirstName, Customers.LastName, Customers.PrivateNumber, 
    Branches.Name, Pawns.ID, Pawns.StartDate, Pawns.FinishDate, 
    Items.Name, Items.Mass, Items.Quantity, Pawns.CurrentSum, 
    Transactions.[Percent], Currencies.Name as Currency, 
    COUNT(1) OVER (PARTITION BY Pawns.ID) AS Cnt, 
    NewDistrPrcnt = (CASE WHEN COUNT(1) OVER (PARTITION BY Pawns.ID) > '1' 
        THEN Items.Mass/SUM(Transactions.[Percent])*Transactions.[Percent] 
        Else Transactions.[Percent] End) 
FROM   
    Customers 
INNER JOIN 
    Pawns ON Customers.ID = Pawns.CustomerID 
INNER JOIN 
    Items ON Pawns.ID = Items.PawnID 
INNER JOIN 
    Branches ON Pawns.BranchID = Branches.ID AND Pawns.LocationID = Branches.ID 
INNER JOIN 
    PawnTypes ON Pawns.PawnTypeID = PawnTypes.ID 
INNER JOIN 
    Currencies ON PawnTypes.CurrencyID = Currencies.ID 
LEFT OUTER JOIN 
    Transactions ON Pawns.ID = Transactions.PawnID AND Pawns.FinishDate = Transactions.Date 
WHERE  
    (Pawns.StatusID = 6) AND (Pawns.FinishDate BETWEEN '15Oct2013' AND '23Oct2013') 
ORDER BY 
    Pawns.ID, Branches.Name, Pawns.FinishDate DESC 

以下錯誤,當我嘗試運行查詢:

消息8120,級別16,狀態1,行1
列'Customers.FirstName'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。

任何人都可以請幫我解決這個問題嗎?

+1

呃,這是怎麼回事與日期格式?請告訴我,您實際上沒有包含該數據的字符串列(這不是很好搜索)。另外,你真的不應該使用'BETWEEN',[特別是在SQL Server中](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil - 具備合common.aspx)。你看到的問題是因爲你在'CASE'語句中有'SUM(Transactions。[Percent])' - 如果你給我們樣本起始數據和預期結果,我們可能會更好地幫助你。 –

+0

也許你需要'SUM(交易。[百分比])'東西? –

回答

0

的問題是與SUM(Transactions.[Percent]) .Replace它與窗函數爲:(SUM(Transactions.[Percent]) over()),並嘗試爲:

SELECT  
    Customers.FirstName, Customers.LastName, Customers.PrivateNumber, 
    Branches.Name, Pawns.ID, Pawns.StartDate, Pawns.FinishDate, 
    Items.Name, Items.Mass, Items.Quantity, Pawns.CurrentSum, 
    Transactions.[Percent], Currencies.Name as Currency, 
    COUNT(1) OVER (PARTITION BY Pawns.ID) AS Cnt 
    ,NewDistrPrcnt = (CASE WHEN COUNT(1) OVER (PARTITION BY Pawns.ID) > '1' 
          THEN Items.Mass/(SUM(Transactions.[Percent]) over())*Transactions.[Percent] 
          Else Transactions.[Percent] End) 
FROM   
    Customers 
INNER JOIN 
    Pawns ON Customers.ID = Pawns.CustomerID 
INNER JOIN 
    Items ON Pawns.ID = Items.PawnID 
INNER JOIN 
    Branches ON Pawns.BranchID = Branches.ID AND Pawns.LocationID = Branches.ID 
INNER JOIN 
    PawnTypes ON Pawns.PawnTypeID = PawnTypes.ID 
INNER JOIN 
    Currencies ON PawnTypes.CurrencyID = Currencies.ID 
LEFT OUTER JOIN 
    Transactions ON Pawns.ID = Transactions.PawnID AND Pawns.FinishDate = Transactions.[Date] 
WHERE  
    (Pawns.StatusID = 6) AND (Pawns.FinishDate BETWEEN '15Oct2013' AND '23Oct2013') 
ORDER BY 
    Pawns.ID, Branches.Name, Pawns.FinishDate DESC 
+0

它工作。非常感謝你! –