2016-04-26 59 views
0

在運行的SQL Server它顯示此錯誤存儲過程:子查詢返回多個值

子查詢返回大於1倍的值。當 子查詢遵循=,!=,<,< =,>,> =或當子查詢用作 表達式時,這是不允許的。

這裏是我的存儲過程的腳本

SELECT 
    (SELECT SUM(GrossSales) 
    FROM cssale 
    WHERE EndDate BETWEEN @StartDate AND @EndDate 
    AND CashierID = @Employee) AS [Total Sales], 

    (SELECT SUM(GrossSales) 
    FROM CSSale 
    WHERE RefundStoreDate BETWEEN @StartDate AND @EndDate 
    AND CashierID = @Employee) AS [Refunds], 

    (SELECT SUM(GrossSales) 
    FROM CSSale 
    WHERE DateVoided BETWEEN @StartDate AND @EndDate 
    AND CashierID = @Employee) AS [Voided Items], 

    (SELECT sum(isnull(C.Amount,0)) AS [Discount Amount] 
    FROM CSSaleItem B 
    LEFT JOIN CSSaleItemDiscount C ON B.CSSaleItemID = C.CSSaleItemID 
    LEFT JOIN CSSale A ON A.CSSaleID = B.CSSaleID 
    LEFT JOIN CSSaleItemTax D ON B.CSSaleItemID = D.CSSaleItemID 
    LEFT JOIN 
    (SELECT CSSaleItemID, 
      Amount, 
      Tax, 
      [Type] 
     FROM CSSaleItemTax 
     WHERE [Type] = 0) AS vsa ON vsa.CSSaleItemID = B.CSSaleItemID 
    WHERE A.EndDate BETWEEN @StartDate AND @EndDate 
    AND A.CashierID = @Employee) AS [Discount], 

    (SELECT CashierId 
    FROM cssale 
    WHERE EndDate BETWEEN @StartDate AND @EndDate 
    AND CashierID = @Employee)AS [Cashier] 

回答

1

一個子查詢只能返回一個值。在下面的一行代碼可能是罪魁禍首..

(SELECT CashierId 
    FROM cssale 
    WHERE EndDate BETWEEN @StartDate AND @EndDate 
    AND CashierID = @Employee)AS [Cashier] 

您可以使用交叉適用/外部適用如果你想返回所有行返回或使用頂部1限制爲只有一行

0

你的問題是(如錯誤說),您的子查詢返回多個值。這就像你試圖將一個表的完整列寫入一個單元格一樣。

嘗試用JOINS解決此查詢,而不是此子查詢。

0

如果員工在給定期間出現超過一次出售,下面的代碼將返回多行。

(SELECT CashierId 
    FROM cssale 
    WHERE EndDate BETWEEN @StartDate AND @EndDate 
    AND CashierID = @Employee)AS [Cashier] 

而不是使用跨國表(cssales);嘗試使用具有員工到收銀員映射的主/域表。這會每次都給出獨特的行。