2014-03-06 35 views
1

我有一個約25列的表來表示位置,我想知道是否有任何方法將此結果轉換爲更清晰的佈局?我有我的SQL線沿線的是:移調SQL結果

SELECT sum(isnull(p.[injuryFace],0)) AS [Face] 
    ,sum(isnull(p.[InjuryHead],0)) AS [Head] 
    ,sum(isnull(p.[InjuryEye],0)) AS [Eye] 
    ,sum(isnull(p.[InjuryLeftFinger],0)) AS [Finger - Left] 
    ,.... 
FROM tbl_OHS_IncidentsPeople P 

這給了我類似

Face | Head | Eye | Finger - Left | .... | 
--------------------------------------------- 
    0 | 1 | 2 |  0  | ... | 

一個結果數據集我想有到底是

Area   | Count | 
------------------------ 
Face   | 0 | 
Head   | 2 | 
Eye   | 3 | 
Finger - Left | 0 | 

不,我看看Simple way to transpose columns and rows in Sql?這似乎有我需要,但我似乎無法理解它在我的腦海中,因爲我不想轉置整個表

任何幫助將是巨大的

乾杯 斯蒂芬

+0

如果你的表是更加規範化,這樣的傷勢在他們自己的子表,並且基本上具有'(victimID,areaID)',這個查詢將是一個簡單的聯接/組合的事情。但是因爲你有多列,所以你被卡住了......如果你使用的是sqlserver或類似的,你可以使用「unpivot」查詢,但除此之外,你最好在客戶端代碼中進行轉換。 –

+0

你可以做一個怪物系列的'聯合',不是嗎? 'SELECT'Face'as'Area',sum(...)As'Count'from tbl_OHS_IncidentsPeople UNION SELECT'Head'as'Area',sum(...)...'你明白了。感覺有點醜陋,我會檢查你的「解釋計劃」來考慮影響,但看起來這樣會得到你描述的結果集。 –

+0

馬克乙是絕對正確的,'正確'的答案是正常化。不過,我的猜測是您正在使用遺留數據庫,並且您的應用程序不是唯一使用它的應用程序。他也是正確的,在客戶端這樣做幾乎肯定是最有效的。 –

回答

2

一種方式是通過工會像下面分裂計數:

select 'Face' as area, sum(isnull(p. [ injuryFace ], 0)) as location 
    from tbl_OHS_IncidentsPeople P 
union all 
select 'Head' as area, sum(isnull(p. [ InjuryHead ], 0)) 
    from tbl_OHS_IncidentsPeople P 
union all 
select 'Eye' as area, sum(isnull(p. [ InjuryEye ], 0)) 
    from tbl_OHS_IncidentsPeople P 
union all 
select 'Finger - Left' as area, sum(isnull(p. [ InjuryLeftFinger ], 0)) 
    from tbl_OHS_IncidentsPeople P 
+0

非常感謝很多傢伙,所以我們的建議是爲傷病地點設置另一張桌子,並且沿着人員ID的欄目列出一些內容,併爲每個受傷地點設置一欄。如果需要,我有能力修改應用程序,如果它更容易,它將是一條路。我試圖避免在每個列中指定未來的更改。 – Stephen

+0

我會有一個表來記錄HITS(person_id,location_id,date_of_hit),LOCATIONS(location_id,location_name)的另一個表格,以及另一個表格(person_id,person_name)。然後,當您查詢時,使用HITS表,並加入LOCATIONS/PERSONS以獲取每個人和地點的名稱。 –

+0

謝謝,我會考慮修改應用程序將位置移動到隔離表中。目前我有一個爲HITS和一個爲人,但也將LOCATION添加到此。只需要解決如何將「複選框」信息移動到一行。 – Stephen