SQL суммировать на основе условия

Да, это возможно. Это сделает это. Скажем, у нас есть перечисление

public enum MyEnum
{
    [Description("MyEnum1 Description")]
    MyEnum1,
    [Description("MyEnum2 Description")]
    MyEnum2,
    [Description("MyEnum3 Description")]
    MyEnum3
}

. Тогда мы можем использовать ObjectDataProvider как

xmlns:MyEnumerations="clr-namespace:MyEnumerations"
<ObjectDataProvider MethodName="GetValues"
                ObjectType="{x:Type sys:Enum}"
                x:Key="MyEnumValues">
    <ObjectDataProvider.MethodParameters>
        <x:Type TypeName="MyEnumerations:MyEnum" />
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

. И для ListBox мы устанавливаем ItemSource в MyEnumValues ​​и применяем ItemTemplate с Конвертер.

<ListBox Name="c_myListBox" SelectedIndex="0" Margin="8"
        ItemsSource="{Binding Source={StaticResource MyEnumValues}}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource EnumDescriptionConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

И в конвертере мы получаем описание и возвращаем его

public class EnumDescriptionConverter : IValueConverter
{
    private string GetEnumDescription(Enum enumObj)
    {
        FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());

        object[] attribArray = fieldInfo.GetCustomAttributes(false);

        if (attribArray.Length == 0)
        {
            return enumObj.ToString();
        }
        else
        {
            DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
            return attrib.Description;
        }
    }

    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Enum myEnum = (Enum)value;
        string description = GetEnumDescription(myEnum);
        return description;
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Empty;
    }
}

Метод GetEnumDescription, вероятно, должен идти куда-то еще, но вы получаете идею:)

-1
задан Varun 18 January 2019 в 11:10
поделиться

3 ответа

Вы можете просто сделать:

select type, avg(case when value in (1, 2) then 1.0 else 0 end) 
from table1
where code = 'Q2'
group by type;
0
ответ дан Gordon Linoff 18 January 2019 в 11:10
поделиться

Вот оно:

select type, cnt_value/sum_value as score 
 FROM (
  SELECT type, count (value) as cnt_value , sum (value) as sum_value 
    FROM Table1
   WHERE
    CODE = 'Q2' AND
   VALUE in (1,2)
   GROUP by type
)
0
ответ дан Ted at ORCL.Pro 18 January 2019 в 11:10
поделиться

Несколько способов сделать это.
Проблема с вашим запросом заключается в том, что вы не выполнили второй шаг - получили ИТОГО количество ответов за Q2.

Вот мой SQLFiddle: http://www.sqlfiddle.com/#!9/898b3f/7

SELECT TYPE, 
COUNT(VALUE), 
(select count(*) from table1 where code = 'Q2') ,
COUNT(VALUE) / (select count(*) from table1 where code = 'Q2') as score
FROM Table1
where
CODE = 'Q2' AND
VALUE in (1,2)
GROUP BY TYPE
0
ответ дан Neville Kuyt 18 January 2019 в 11:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: