2016-10-20 3 views
0

Я создаю общий хранилище данных ключа/значения в MS SQL Server. У меня есть таблица UserDecimalData определяется следующимSQL SUM() по значению другого столбца

create table [UserDecimalData] (
    [UserID] nvarchar(64) not null, 
    [ValueKey] uniqueidentifier not null, 
    [Value] decimal null 
); 
alter table [UserDecimalData] 
    add constraint PK_UserDecimalData primary key clustered ([UserID], [Date], [ValueKey]); 

и в качестве примера, вот некоторые данные, которые используют GUID, оканчивающийся 0001, чтобы указать счет индивидуума в игре, и GUID заканчивая 0002, чтобы указать, какую команду пользователь включен.

UserID ValueKey        Value 
Dave 00000000-0000-0000-0000-000000000001 35 
Dave 00000000-0000-0000-0000-000000000002 1 
Phil 00000000-0000-0000-0000-000000000001 35 
Phil 00000000-0000-0000-0000-000000000002 1 
Pete 00000000-0000-0000-0000-000000000001 35 
Pete 00000000-0000-0000-0000-000000000002 2 

я могу легко найти счет для физического лица путем поиска их UserID + ValueKey заканчивая 0001. Я могу также узнать, какая команда человек находится в поиске по их UserID + значения строки, где ValueKey заканчивается 0002.

Мой вопрос в том, как я могу получить список баллов команды? В этом случае команда 1 будет иметь 70 и команда 2 будет иметь 35.

+0

Вы приезжаете против одной из проблем, которая приводит к тому, что [EAV рассматривается как анти-шаблон SQL] (программа http: // rs.stackexchange.com/q/93124), это почти наверняка не самый эффективный способ хранения этих данных. – GarethD

ответ

1
select v1.Value as Team, sum(v2.value) as TeamScore 
from userdecimaldata v1 
join userdecimaldata v2 on v2.UserId = v1.UserId and v2.[Date] = v1.[Date] 
where v1.ValueKey = @clankey and v2.ValueKey = @scoreKey 
group by v1.Value 

ВЫВОД

Team TeamSccore 
    1 70 
    2 35 
+0

Отметьте это как правильное по сравнению с другим ответом чисто для удобочитаемости. –

2

Вот один метод:

select sum(udd.value) 
from UserDecimalData udd 
where udd.ValueKey like '%1' and 
     exists (select 1 
       from UserDecimalData udd2 
       where udd2.ValueKey like '%2' and 
        udd2.UserId = udd.UserId 
      ); 
0
--first way 
with commands as (
    select UserID as UserID, Value as command 
    from UserDecimalData 
    where ValueKey like '%2' 
) 
select c.command, sum(Value) 
from UserDecimalData u 
    left join commands c on u.UserID = c.UserID 
where ValueKey like '%1' 
group by command 
GO 

--second way 
select c.command, sum(Value) 
from UserDecimalData u 
    left join (
      select UserID as UserID, Value as command 
      from UserDecimalData 
      where ValueKey like '%2' 
     ) c on u.UserID = c.UserID 
where ValueKey like '%1' 
group by command 
GO 

--results 
--1 70 
--2 35 
0
select u1.Value, sum(u0.Value) 
from UserDecimalData u1 
    left join UserDecimalData u0 on u0.UserID = u1.UserID and u0.ValueKey like '%1' 
where u1.ValueKey like '%2' 
group by u1.Value 

GO 
Смежные вопросы