SQL Server-按不同列中的值分组

SQL Server-按不同列中的值分组,sql,sql-server,group-by,Sql,Sql Server,Group By,我有一组数据如下: ID Person1 Value1 Person2 Value2 Person3 Value3 Period --------------------------------------------------------------------- 1 A 1 D 1 June 2 B 2

我有一组数据如下:

   ID   Person1   Value1   Person2   Value2   Person3   Value3   Period
  ---------------------------------------------------------------------
   1       A        1         D        1                          June
   2       B        2                                             July
   3       C        3                                             June
   4       B        1         C        3         A        2       August
   5       C        2         A        2                          June
列ID只是一个行标识符,没有任何意义。我想按个人和时期对他们进行分组,然后是每个人的价值总和。预期结果如下所示:

Person   Period   Value
-----------------------
   A      June      3
   A      August    2
   B      July      2
   B      August    1
   C      June      5
   C      August    3
   D      June      1
这可行吗?任何帮助都将不胜感激

根据问题编辑和评论:


原始答案

将问题简化为需要解决的步骤

先规范化

SELECT Person1 as Person, Value1 as Val
FROM tablename
UNION ALL
SELECT Person2 as Person, Value2 as Val
FROM tablename
UNION ALL
SELECT Person3 as Person, Value3 as Val
FROM tablename
然后将em与groupby相加,就像正常情况一样

SELECT Person, SUM(Val) as total
FROM (
  SELECT Person1 as Person, Value1 as Val
  FROM tablename
  UNION ALL
  SELECT Person2 as Person, Value2 as Val
  FROM tablename
  UNION ALL
  SELECT Person3 as Person, Value3 as Val
  FROM tablename
) sub
GROUP BY Person

为此,我喜欢使用
apply

select v.person, v.period, sum(v.value)
from t apply
     (values (Person1, Value1, Period),
             (Person2, Value2, Period),
             (Person3, Value3, Period)
     ) v(Person, Value, Period)
group by v.person, v.period;

不,这是不可行的。。。您发现了一个无法解决的问题!:那将是非常不幸的@霍加尼对这个问题稍加修改。绝对不容易。谢谢你的帮助@Hoganok@Reb.Z——我会回答这个问题,但根据我给你们展示的内容,这真的很容易。非常感谢@霍根在尝试和测试了不同的数据集之后,这正是我想要的。谢谢大家!@霍根人和价值观呢?@Hogan。我认为代码很容易概括;)事实上,当我第一次读这个问题的时候,我只是错过了它们。
select v.person, v.period, sum(v.value)
from t apply
     (values (Person1, Value1, Period),
             (Person2, Value2, Period),
             (Person3, Value3, Period)
     ) v(Person, Value, Period)
group by v.person, v.period;
;WITH CTE (Person , Val) AS (SELECT Person1 as Person, Value1 as Val FROM          tablename UNION ALL SELECT Person2 as Person, Value2 as Val FROM tablename UNION ALL SELECT Person3 as Person, Value3 as Val FROM tablename ) SELECT Person, SUM(Val) FROM CTE GROUP BY Person