2016-11-10 50 views
3

我有一組數據是這樣的:SQL服務器 - 通過價值觀集團從不同的列

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 

可行嗎?任何幫助,將不勝感激!

+0

不,它是不可行......你已經發現了一個不是solv的問題能夠! :D – Hogan

+0

這將是非常不幸的。 @Hogan –

回答

3

基於問題編輯和評論:

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

原來的答覆

減少問題的措施來解決。

首先正常化

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) 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 
+0

我編輯了一些問題。絕對不容易。謝謝你的幫助。 @Hogan –

+0

ok @ Reb.Z - 我會回答這個問題,但根據我給你展示的內容,這非常簡單。 – Hogan

+0

非常感謝! @Hogan –

0

我喜歡用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; 
+0

Person3和Value3呢? – Hogan

+0

@霍根。 。 。我認爲代碼很容易概括;)其實,當我第一次閱讀這個問題時,我只是錯過了它們。 –

0
;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