2017-01-20 6 views
0

Я использую SQL Server 2008 R2. Я использую следующий запрос, чтобы увидеть сумму количества затрат времени для всех продуктов в пакете.Обновить запись в таблице, взяв сумму из другой таблицы в SQL Server 2008 R2

select 
    a.nid, a.packagename, 
    case 
     when sum(b.quantity * c.price) is null 
      then 0 
      else sum(b.quantity * c.price) 
    end 
from 
    tblpackage as a 
left join 
    tblpackage_service as b on a.nid = b.package_id 
left join 
    tblproduct as c on c.nid = b.service_id 
group by 
    a.nid, a.packagename 

который возвращает следующий результат

nid packagename  (No Column Name) 
--------------------------------------- 
6 Test Package 4 400.00 
3 Test Package 5  0.00 
5 Test Package 6 1350.00 
8 Test Package 7 350.00 
7 Test Package 8 400.00 
9 Test Package 9 400.00 
1 Test Package 1  0.00 
2 Test Package 2  0.00 
4 Test Package 3 3900.00 

Теперь я обновляю то же самое, используя

update tblpackage 
set tblpackage.amount = case 
          when sum(b.quantity * c.price) is null 
           then 0 
           else sum(b.quantity * c.price) 
         end 
from tblpackage AS a 
left join tblpackage_service as b on a.nid = b.package_id 
left join tblproduct as c on c.nid = b.service_id 

и я получаю сообщение об ошибке:

An aggregate may not appear in the set list of an UPDATE statement.

Так есть ли способ сделать это, используя обновление запрос.

Пожалуйста, помогите. Заранее спасибо.

ответ

1

Возможно, это будет работать лучше.

;WITH newtblpackage_service AS(
     SELECT package_id,SUM(quantity*price) as sum1 
     FROM tblpackage_service a left join tblproduct as c on c.nid = a.service_id 
     GROUP BY package_id 
) 

update tblpackage 
set tblpackage.amount = CASE WHEN sum1 IS NULL 
          THEN 0 
          ELSE sum1 
         END 
from tblpackage AS a 
left join newtblpackage_service as b on a.nid = b.package_id 

Потому что tblpackage_service можно использовать для поиска суммы (так кажется).

+0

это работает, спасибо – rexroxm

3

Попробуйте это:

;WITH tblpackage_serviceCTE AS(
     SELECT package_id,SUM(quantity) as quantity 
     FROM tblpackage_service 
     GROUP BY package_id 
),tblproductCTE AS(
     SELECT nid,SUM(price) as price 
     FROM tblproduct 
     GROUP BY nid 
) 
update tblpackage 
set tblpackage.amount = CASE WHEN tblpackage_serviceCTE.quantity * tblproductCTE .price) IS NULL 
          THEN 0 
          ELSE tblpackage_serviceCTE.quantity * tblproductCTE .price 
         END 
from tblpackage AS a 
left join tblpackage_serviceCTE as b on a.nid = b.package_id 
left join tblproductCTE as c on c.nid = b.service_id 

Примечание: Возьмите бекап: P

+0

dosen't работа как цена не является частью tblpackage_service – rexroxm

+0

@rexroxm 'tblpackage_service' была опечатка' tblproduct' должен быть там во второй ЦКК: 0 –

+0

уверен, но, создав tblproductCTE я не смогу присоединиться к нему с tblpackageCTE, поскольку в нем нет service_id. – rexroxm