2013-03-14 2 views
2

В MS Sql.Подзапрос возвратил более 1 значения в MS SQL

SELECT a.SellerID, 
     SUM(TransactionFee) as TransactionFees, 
SUM(Quantity*a.PriceItem) as TransactionValue, 
COUNT(*) as OrdersWithTransactionFees, 
      SUM(Quantity) as Qty, 
      (SELECT SUM(a.Quantity*a.PriceItem) as WholeMonthTransactionValue 
      from BuyProductDetails where SellerID = a.SellerID) as aa 
FROM BuyProductDetails as a 
WHERE MONTH(a.OrderDate)=3 
AND YEAR(a.OrderDate)=2013 
AND TransactionFee IS NOT NULL 
GROUP BY a.SellerID 

У меня есть вышеуказанный запрос ... он, похоже, не может работать.

В принципе, у меня есть эта таблица BuyProductDetails, который хранит все заказы от разных Продавцов.

Некоторые заказы будут иметь TransactionFee.

Теперь мне нужно рассчитать общий объем продаж этих заказов с помощью TransactionFee и общий объем продаж для этих продавцов, включая эти заказы без TransactionFee.

Результирующий набор должен иметь следующие поля:

  1. SellerID
  2. Сумма сбора транзакций
  3. Сумма общего объема продаж
  4. Количество заказов с оплатой стоимости сделки
  5. Кол-во упорядоченный
  6. Всего продаж этого продавца

Но когда я запускаю этот SQL, он возвращает следующую ошибку:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

Любая помощь очень ценится. Спасибо.

+1

У меня есть решение. Это был ответ от кого-то, но я не вижу его ответа сейчас на этой странице. Интересно, почему? В принципе, просто измените подзапрос на следующее: SELECT SUM (b.Quantity * b.PriceItem) как WholeMonthTransactionValue из BuyProductDetails b, где b.SellerID = a.SellerID –

ответ

0

Пробовал что-то вроде этого?

SELECT a.SellerID, 
    SUM(TransactionFee) as TransactionFees, 
    SUM(Quantity*a.PriceItem) as TransactionValue, 
    COUNT(*) as OrdersWithTransactionFees, 
    SUM(Quantity) as Qty, 
    MIN(a.WholeMonthTransactionValue) as WholeMonthTransactionValue 
    FROM BuyProductDetails as a, 
(SELECT b.SellerID, 
     SUM(b.Quantity*b.PriceItem) as WholeMonthTransactionValue, 
     MONTH(b.OrderDate), 
     YEAR(b.OrderDate) 
FROM BuyProductDetails b 
GROUP BY b.SellerID, 
    MONTH(b.OrderDate) as MonthID, 
    YEAR(b.OrderDate) as YearID) as aa 
    WHERE MONTH(a.OrderDate)=3 
     AND YEAR(a.OrderDate)=2013 
     AND TransactionFee IS NOT NULL 
     AND a.SellerID = aa.SellerID 
     AND MONTH(a.OrderDate)=aa.MonthID 
     AND YEAR(a.OrderDate) = aa.YearID 
    GROUP BY a.SellerID) 
0

Вы можете использовать более эффективный вариант с CASE выражения

SELECT a.SellerID, 
     SUM(CASE WHEN TransactionFee IS NOT NULL THEN TransactionFee END) AS TransactionFees, 
     SUM(CASE WHEN TransactionFee IS NOT NULL THEN Quantity * PriceItem END) AS TransactionValue, 
     COUNT(CASE WHEN TransactionFee IS NOT NULL THEN 1 END) as OrdersWithTransactionFees, 
     SUM(CASE WHEN TransactionFee IS NOT NULL THEN Quantity END) as Qty, 
     SUM(Quantity * PriceItem) AS WholeMonthTransactionValue   
FROM BuyProductDetails AS a 
WHERE MONTH(a.OrderDate) = 3 AND YEAR(a.OrderDate) = 2013 
GROUP BY a.SellerID 

Демы на SQLFiddle

или просто добавить правильный псевдоним в подзапросе

SELECT a.SellerID, 
     SUM(TransactionFee) as TransactionFees, 
     SUM(Quantity*a.PriceItem) as TransactionValue, 
     COUNT(*) as OrdersWithTransactionFees, 
     SUM(Quantity) as Qty, 
     (SELECT SUM(d.Quantity * d.PriceItem) 
     FROM BuyProductDetails d 
     WHERE d.SellerID = a.SellerID) as WholeMonthTransactionValue 
FROM BuyProductDetails as a 
WHERE MONTH(a.OrderDate)=3 
AND YEAR(a.OrderDate)=2013 
AND TransactionFee IS NOT NULL 
GROUP BY a.SellerID 

Demo на SQLFiddle

Смежные вопросы