2016-07-05 80 views
0

使用SQL Server 2000 - 我有一箇舊的數據庫,它沒有標準化。按非標準化列分組

它像

memId 
c1 
c2 
c3 
c4 
c5 

這些列包含在這裏的一些樣品一堆列

123 
10 
20 
0 
40 
0 

123 
0 
20 
0 
40 
5 

我想要的是,以提取memId和列名這樣

分組數據

會作爲

memId col total 
123 c1 10 
123 c2 40 
123 c4 80 
123 c5 5 

其中數字是該組的總和

我想我可以每次拉動它們並將它們結合在一起,但想知道是否有更簡單的方法。

+0

使用樞軸.....? –

+0

它的SQL 2000分貝和unpivot似乎不被支持 –

+6

人們仍然使用SQL2000?!我的吊... ...... – DavidG

回答

1

聽起來像是想要unpivot您的結果。爲你的數據庫的一個選擇是union all

select memId, 'c1' as col, sum(c1) from yourtable group by memId, col 
union all 
select memId, 'c2' as col, sum(c2) from yourtable group by memId, col 
union all 
select memId, 'c3' as col, sum(c3) from yourtable group by memId, col 
union all 
select memId, 'c4' as col, sum(c4) from yourtable group by memId, col 
union all 
select memId, 'c5' as col, sum(c5) from yourtable group by memId, col 
+0

是的我在我的問題中提到過這個問題「我想我可以每次拉動它們並將它們結合在一起」 –

+0

@sgeddes實際上,GROUP BY邏輯地發生在select語句之前,因此查詢失敗。 –

-1

看來我誤解你的意思,哎呀呀。你正在將信息遷移到另一個表中?

但首先,關於我所用術語標準化

First Normal Form 
- Eliminate repeating groups in individual tables. 
- Create a separate table for each set of related data. 
- Identify each set of related data with a primary key. 

的音符所以顯然我錯了有關規範化。 Ouch。好東西 我還年輕,呃? :/

我花了一些時間重新評估這個(一個致命的錯誤,不?),以及SQL Server 2000的限制是什麼。我在redware - SQL SERVER Handbook上找到了有用的SQL Server 2000手冊編譯。

說到表格表達式......唯一出現的是subqueriesviews,雖然沒有真正的排序功能可用(謝天謝地,您可以創建Functions)。

雖然你可能通過某種草書添加一個值,爲什麼?

  • 你仍然會被解析表至少ň X #Columns是逆轉置。不需要複雜的支點(反正不存在)。
  • 'C1'很簡單,很容易修改爲行,而不是使用任何昂貴的草書。
  • 你想連接表,所以最簡單的方法仍然是UNION ALL
  • 可以在連接後運行一次GROUP BY。簡單而優雅。

SOLUTION:

SELECT memID 
    , Col 
    , SUM(C1) AS Count 
FROM (
     SELECT 'C1' AS [Col], memID, C1 FROM #Test2 
     UNION ALL SELECT 'C2' AS [Col], memID, C2 FROM #Test2 
     UNION ALL SELECT 'C3' AS [Col], memID, C3 FROM #Test2 
     UNION ALL SELECT 'C4' AS [Col], memID, C4 FROM #Test2 
     UNION ALL SELECT 'C5' AS [Col], memID, C5 FROM #Test2) AS A 
GROUP BY memID, Col 
ORDER BY memID ASC, Col ASC 

源表:

CREATE TABLE #Test2 (memID INT, C1 INT, C2 INT, C3 INT, C4 INT, C5 INT) 
INSERT INTO #Test2 (memId, C1, C2, C3, C4, C5) 
VALUES (123, 10, 20, 0, 40, 0) 
    , (123, 0, 20, 0, 40, 5) 
    , (122, 5, 20, 10, 15, 0) 
    , (122, 5, 0, 0, 0, 60) 
    , (155, 10, 0, 0, 10, 10) 
    , (155, 0, 0, 0, 50, 50) 

結果:

memID Col Count 
122  C1 10 
122  C2 20 
122  C3 10 
122  C4 15 
122  C5 60 
123  C1 10 
123  C2 40 
123  C3 0 
123  C4 80 
123  C5 5 
155  C1 10 
155  C2 0 
155  C3 0 
155  C4 60 
155  C5 60 

所以我認爲你的最初想法是正確的。 乾杯。

+0

我已經有了這種格式的數據,我需要它使得每個列成爲一個行,按照我提供的示例。 –

+0

@DaleFraser查看我的更新迴應。反饋,肯定不想堅持不好的知識! –