Я использую ваши две таблицы с примерами (таблица 1 = заказы, таблица 2 = товары). Вот как можно найти номера заказов, которые содержат элементы двора, но не содержат складские элементы:
select o.orderno
from orders o
join items i on i.itemno = o.itemno
group by o.orderno
having count(case when i.location = 'Yard' then 1 end) > 0
and count(case when i.location = 'Warehouse' then 1 end) = 0;
Если вы хотите показать завершенные заказы, используйте вышеуказанный запрос в подзапросе, например:
[111 ]Если вы хотите вместо этого агрегировать по заказу, вы можете соответствующим образом изменить запрос, например:
select
o.orderno,
count(*) as number_of_positions,
sum(o.amount) as number_of_pieces,
sum(o.amount * i.weight) as total_weight
from orders o
join items i on i.itemno = o.itemno
group by o.orderno
having count(case when i.location = 'Yard' then 1 end) > 0
and count(case when i.location = 'Warehouse' then 1 end) = 0
order by o.orderno;
И если вы хотите агрегировать по элементу, вам может понадобиться подзапрос плюс отдельная агрегация.
Палка a AttributeUsage
припишите на свой класс Атрибута (да, это - полный рот), и набор AllowMultiple
кому: true
:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute
AttributeUsageAttribute;-p
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyAttribute : Attribute
{}
Обратите внимание, однако, на это при использовании ComponentModel (TypeDescriptor
), это только поддерживает один экземпляр атрибута (на тип атрибута) на участника; необработанное отражение поддерживает любое число...
Как альтернатива, думайте о перепроектировании Вашего атрибута допускать последовательность.
[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]
или
[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]
затем проанализируйте значения для конфигурирования атрибута.
Для примера этого выезда AuthorizeAttribute в ASP.NET исходный код MVC по www.codeplex.com/aspnet.
Решение Антона верное, но есть еще одна проблема .
Короче говоря, если ваш настраиваемый атрибут не переопределяет TypeId, доступ к нему осуществляется через PropertyDescriptor.GetCustomAttributes () вернет только один экземпляр вашего атрибута.