2016-09-16 3 views
0

Когда я пытаюсь этот запросрезультат Сумма в SQL запросе

Select S.Name,S.No, 
SUM(Case when s.Furit =’Mango’ then total else 0 end) as Mango, 
SUM(Case when s.Furit =’Apple’ then total else 0 end) as Apple, 
SUM(total) total, 
Sum(convert(int,Am)) Amount, MAX(S.Value) Value 
from (
Select 
Veh_table.Name, Veh_table.No, VV_table.Furit, count(VV_table.Furit) as total, Veh_table. Amount as Am, Veh_table. Value 
from VV_table 
inner join Veh_table on VV_table.MID=Veh_table.ID 
inner join Re_table on Veh_table.RID=Re_table.RID 
WHERE 
Re_table.StartDate>= '2016-08-01 00:00:00' and 
Re_table.EndDate<='2016-08-31 23:59:59' and 
Re_table.Region= 'UK' 
and Veh_table.No= '431' 
AND Furit <> '' 
Group By Veh_table.Name, Veh_table.RegNo, VV_table.Furit,Veh_table.Amount,Veh_table.Value) S 
GROUP BY 
s.No,s.Name 

это шоу результат, как этот

Name No Mango Apple total Amount  Value 
John 431 9  2  11  964  98 

Когда я удалить фрукты сверху и попробовать этот

Select S.Name,S.No 
SUM(total) total, 
Sum(convert(int,Am)) Amount, MAX(S.Value) Value 
from (
Select 
Veh_table.Name, Veh_table.No,count(VV_table.Furit) as total, Veh_table.Amount as Am, Veh_table.Value 
from VV_table 
inner join Veh_table on VV_table.MID=Veh_table.ID 
inner join Re_table on Veh_table.RID=Re_table.RID 
WHERE 
Re_table.StartDate>= '2016-08-01 00:00:00' and 
Re_table.EndDate<='2016-08-31 23:59:59' and 
Re_table.Region= 'UK' 
and Veh_table.No= '431' 
AND Furit <> '' 
Group By Veh_table.Name, Veh_table.RegNo, Veh_table.Amount,Veh_table.Value) S 
GROUP BY 
s.No,s.Name 

Name RegNo total Amount Value 
John 431  11  243 98 

Теперь я хотите также Манго и Apple в данных также правильная сумма составляет 243. когда я удалить VV_table.Furit из отборных затем составит 243 дисплей, который является правильным тогда, когда я добавляю VV_table.Furit тогда составит 964 является дисплей, который неправильно я хочу привести как этот

Name No Mango Apple total Amount Value 
John 431  9 2  11  243  98 
+0

Вы не должны включать Veh_table.Amount в GROUP BY, а скорее суммируйте его – StanislavL

+1

Ваш первый запрос Group by содержит VV_table.Furit, тогда как второй doen't. Таким образом, вы получаете разные значения сумм. Операция агрегации не является одинаковой. – istovatis

+0

@StanislavL когда я удаляю количество из группы, тогда это показывает несколько результатов и ошибок. Столбец «Veh_table.Amount» недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY. – user6628729

ответ

0

Вы не можете удалять VV_table из запроса без изменения результата, если в поле есть пустые значения Furit в этой таблице (VV_table.Furit = ''). Условие

AND Furit <> '' 

исправляет результат без этих пустых значений.

Кроме того, вы должны использовать подход с с-синтаксиса, например:

WITH pre AS (
    SELECT 
     Veh_table.Name, Veh_table.No, VV_table.Furit, count(VV_table.Furit) AS total, Veh_table. Amount AS Am, Veh_table.Value 
    FROM VV_table 
     INNER JOIN Veh_table on VV_table.MID=Veh_table.ID 
     INNER JOIN Re_table on Veh_table.RID=Re_table.RID 
    WHERE 
     Re_table.StartDate>= '2016-08-01 00:00:00' AND 
     Re_table.EndDate<='2016-08-31 23:59:59' AND 
     Re_table.Region= 'UK' 
     AND Veh_table.No= '431' 
     AND Furit <> '' 
    GROUP BY Veh_table.Name, Veh_table.RegNo, VV_table.Furit,Veh_table.Amount,Veh_table.Value 
) 
SELECT pre.Name,pre.No, 
    SUM(CASE WHEN pre.Furit =’Mango’ THEN total ELSE 0 AND) AS Mango, 
    SUM(CASE WHEN pre.Furit =’Apple’ THEN total ELSE 0 AND) AS Apple, 
    SUM(total) AS total, 
    Sum(convert(int,Am)) AS Amount, 
    MAX(pre.Value) AS Value 
FROM pre 
GROUP BY pre.No,pre.Name; 

Он не отвечает на йор запроса, но улучшить запрос чтения и позволяет избавиться от подзапроса.

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