SQL — ошибка подзапроса и ошибка суммы

Код SQL, который у меня есть, показан ниже. У меня проблема в первую очередь с подзапросом. В результате отображается ошибка:

ОШИБКА SQL: подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=, ‹, ‹= , >, >= или когда подзапрос используется как выражение

Необходимо отображать строки с датой, большей (или равной) дате, где ESource = Detail — строки должны быть суммированы в одних столбцах, а одно значение выбрано в других.

Используемый код:

select DISTINCT 
  A.Policy, 
  A.Fund, 
 (SUM(A.AddUnits)) AS SUM,
 ((C.TotalUnits - (SUM(A.AddUnits))) * A.Price) AS Value, 

Inner JOIN TableC C
ON C.PolicyNumber = A.PolicyNumber 

where A.PolicyNumber = '120' AND C.NumberOfUnits > 0 AND C.InvestmentFund = A.InvestmentFund 

AND A.DateOfEntry < DATEADD(year, -1, GetDate())
AND A.DateOfEntry >= (Select DateOfEntry FROM TableA AS D where D.ESource = 'Detail') 
AND A.UnitPrice = (Select UnitPrice FROM TableA AS E where E.ESource = 'Detail')

ORDER BY IH.DateOfEntry DESC

Таблицы:

Таблица А:

Цена паев страхового фонда ESource Дата

120 БР 6 0,74 ОТ 2015 г.

120 БР -100 0,72 Деталь 2014 г.

120 BR 6 0,71 RE 2013

ТАБЛИЦА С:

Страховой фонд TotalUnits

120 400 руб.

ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ:

Полис Фонд Сумма Цена Стоимость

120 БР [6+(-100)] = -94 0,72 [(400+(-94))*0,72] = 220,32

А также проблемы с подзапросом - команда для получения price = 0.72 [where ="Detail"] останавливает сумму обеих строк, образующих Sum = -100, а не -94

Любая помощь с ошибками будет принята с благодарностью


person banana789    schedule 27.01.2015    source источник


Ответы (1)


Проблема в вашем предложении where:

where A.PolicyNumber = '120' AND
      C.NumberOfUnits > 0 AND
      C.InvestmentFund = A.InvestmentFund  AND
      A.DateOfEntry < DATEADD(year, -1, GetDate()) AND
      A.DateOfEntry >= (Select DateOfEntry FROM TableA AS D where D.ESource = 'Detail') AND
      A.UnitPrice = (Select UnitPrice FROM TableA AS E where E.ESource = 'Detail')

Последние два пункта - проблема. Один из способов исправить это — использовать ключевые слова ANY, SOME или ALL:

where A.PolicyNumber = '120' AND
      C.NumberOfUnits > 0 AND
      C.InvestmentFund = A.InvestmentFund  AND
      A.DateOfEntry < DATEADD(year, -1, GetDate()) AND
      A.DateOfEntry >= ALL (Select DateOfEntry FROM TableA AS D where D.ESource = 'Detail') AND
      A.UnitPrice = ALL (Select UnitPrice FROM TableA AS E where E.ESource = 'Detail')

Однако я предпочитаю явное агрегирование:

where A.PolicyNumber = '120' AND
      C.NumberOfUnits > 0 AND
      C.InvestmentFund = A.InvestmentFund  AND
      A.DateOfEntry < DATEADD(year, -1, GetDate()) AND
      A.DateOfEntry >= (Select MAX(DateOfEntry) FROM TableA AS D where D.ESource = 'Detail') AND
      A.UnitPrice = (Select MAX(UnitPrice) FROM TableA AS E where E.ESource = 'Detail')

Обратите внимание, что в запросе в вашем вопросе отсутствует предложение from. И условие C.InvestmentFund = A.InvestmentFun должно быть в пункте on, а не в пункте where.

person Gordon Linoff    schedule 27.01.2015