Я бы не рекомендовал использовать решение с помощью typedef
:
#define STATIC_ASSERT(COND,MSG) typedef char static_assertion_##MSG[(COND)?1:-1]
Объявление массива с ключевым словом typedef
НЕ гарантируется, что оно будет оцениваться во время компиляции. Например, следующий код в области блока будет компилироваться:
int invalid_value = 0;
STATIC_ASSERT(invalid_value, this_should_fail_at_compile_time_but_will_not);
Я бы рекомендовал это вместо этого (на C99):
#define STATIC_ASSERT(COND,MSG) static int static_assertion_##MSG[(COND)?1:-1]
Из-за ключевого слова static
массив будет определен во время компиляции. Обратите внимание, что это утверждение будет работать только с COND
, которые оцениваются во время компиляции. Он не будет работать (например, сбой компиляции) с условиями, основанными на значениях в памяти, таких как значения, присвоенные переменным.
Вы бы использовали sum()
. Например:
select orderid, sum(quantity * unit_price)
from t
group by orderid;
Это дает сумму для каждого заказа. Вы можете изменить запрос, чтобы получить итоговую сумму за каждый продукт или все, что вам нужно.
Используйте агрегатную функцию sum
и group by
поле Products_ID
, например :
select t.orderid, t.products_id, sum(t.quantity*t.[unit price]) as price
from YourTable t
group by t.orderid, t.products_id
Измените YourTable
на свое имя таблицы.