2013-05-28 1 views
2

я хочу подвести переменную, которая держит значение в цикле,Сумма нескольких значений одной переменной

Вот мой стол:

name | pkey | cinema1~cinema10 | total_QTy | total_sales 
aaa | 1 | 100.00 ~ 200.00 |  2  | 300.00 
bbb | 2 | 150.00 ~ 145.00 |  3  | 295.00 

total_Qty является суммой билетов купленной в Cinema1 ~ cinema10 для имени aaa , и я не знаю, как это сделать. Я только получаю последнее значение счетного билета, который называется bbb cinema10.

Помогите мне пожалуйста. Я застрял здесь.

Вот мой код для получения количества и Qty

WHILE ISNULL(@cinema_key, 0) <> 0 
BEGIN 

    SET @amount = 0 


SELECT @amount =(SUM(t1.price)), @qty = (count(t1.cnt)) 
FROM(
    SELECT 
      (ISNULL(SUM(mctrs.price),0) - (ISNULL(SUM(mctrs.lgu_tax_amount),0) + ISNULL(SUM(mctrs.ordinance_1),0) + ISNULL(SUM(mctrs.ordinance_2),0)+ ISNULL(SUM(mctrs.ordinance_3),0) + ISNULL(SUM(mctrs.ordinance_4),0))) AS 'price', 
      count(mctrs.[key]) as 'cnt', mctrs.[key] as ckey 
    FROM 
    movie_calendar mc 
    INNER JOIN 
    movie_database md 
    ON 
    mc.movie_key = md.[key] AND mc.screening_start_date = @tdate 
    INNER JOIN 
    cinemas c 
    ON 
    mc.cinema_key = c.[key] AND c.[key] = @cinema_key 
    INNER JOIN 
    movie_calendar_times mct 
    ON 
    mct.movie_calendar_key = mc.[key] 
    LEFT OUTER JOIN 
    movie_calendar_time_reserved_seats mctrs 
    ON 
    mctrs.movie_calendar_time_key = mct.[key] 
    INNER JOIN 
    patrons p 
    ON 
    mctrs.patron_key = p.[key] 
    WHERE mctrs.status = 1 AND mctrs.[committed]=1 
    GROUP BY p.patron_tag,mctrs.price,P.APPLY_LGU_TAX ,P.LGU_TAX_AMOUNT, mctrs.[key] 

)t1 

    SET @buffer = 'UPDATE #temptable SET cinema'+CAST(@count AS VARCHAR)+' = '+CAST(ISNULL(sum(@amount),0) AS VARCHAR)+' WHERE [date] = '''+CAST (@tdate AS VARCHAR)+'''' 

    PRINT (@buffer) 
    EXEC(@buffer) 
    insert into #tqty(qty) values(@qty) 

    DELETE FROM #cinema_list WHERE cinema_key = @cinema_key 

    SET @cinema_key = NULL 
    SET @cinema_code = NULL 

    SELECT TOP 1 @cinema_key = cinema_key, @cinema_code = cinema_code FROM #cinema_list ORDER BY display_order 

    SET @count = @count + 1 

END /*WHILE CINEMA KEY*/ 

и вот мой код в обновлении total_Qty и total_sales:

WHILE @count < @cinema_count 
BEGIN 
    SET @count = @count+1. 
    SET @select = @select+'cinema'+CAST(@count AS VARCHAR)+'+' 
END 
SET @select = SUBSTRING(@select, 1, LEN(@select) - 1) 
SET @buffer = 'UPDATE #temptable SET total_quantity = ' +cast(@qty as varchar) + ', ' + 'total_sales = '[email protected] 
PRINT @buffer 
EXEC(@buffer) 

Помощь пожалуйста: 3 Благодарности :)

+0

что смысл "Cinema1 ~ cinema10"? – Bohemian

+0

ooops sorry, cinema1 ~ cinema10 - динамический столбец, количество кинотеатров зависит от БД. – Dakoy

+0

Эй @ Дакой: Извините, но это так, но использование динамических колонок (cinema1, cinema2, ...) - это почти всегда неправильная работа в дизайне базы данных SQL. Любая вероятность того, что структура может быть изменена на «Cinema_id» и «Price» с строками, содержащими («1», 100) («10», 200)? Это сделало бы эту проблему довольно тривиальной: SELECT cinema_id, сумма (цена) из tablex group by cinema_id. Даже если вы не можете изменить внутреннюю структуру, может возникнуть смысл подготовить правильную структуру до отчетности и анализа ... Даже если это временно. –

ответ

0

Я согласен с @Dave Collins в том, что это не дизайн базы данных на самом большом уровне, однако, если вам нужен простой ответ, вам нужно добавить существующее значение к текущему итогу в вашем обновлении.

Изменить это:

SET @buffer = 'UPDATE #temptable SET cinema'+CAST(@count AS VARCHAR)+' = '+CAST(ISNULL(sum(@amount),0) AS VARCHAR)+' WHERE [date] = '''+CAST (@tdate AS VARCHAR)+'''' 

Для этого:

SET @buffer = 'UPDATE #temptable SET cinema'+CAST(@count AS VARCHAR)+' = ISNULL(cinema,0) + '+CAST(ISNULL(sum(@amount),0) AS VARCHAR)+' WHERE [date] = '''+CAST (@tdate AS VARCHAR)+''''