[英]Convert “flat” SQL query result into table structure
我有一個SQL表如下返回結果:
Amount Descrip
----------------------------
1.34 Group1 Description1
2.36 Group2 Description2
5.46 Group3 Description3
4.54 Group1 Description4
6.23 Group2 Description5
我需要使它看起來像這樣。
Descrip Group1 Group2 Group3
------------------------------------
Description1 1.34
Description2 2.36
Description3 5.46
Description4 4.54
Description5 6.23
要記住的事情是,沒有固定的規則,第3組將存在或與此有關的任何一組。 組列表由查詢結果確定。 我可以一次擁有Group1,Group2,Group4和Group6,而沒有Group4,但又擁有Group5。
我知道我可以在.net代碼做到這一點,但是這將是一次在代碼耗時。 我寧願在SQL Server中執行此操作,只需將其綁定到結果集即可。
附帶說明一下,如果有一種方法可以匯總值以在底部獲得總計(如Group1的5.88),那就太好了。 我可以做在侏儒時間計算的,但想做到這一點的服務器端,以及我是否能。
看用樞軸
SELECT 'Amount' AS MaxAmount, [Group1], [Group2], [Group3]
FROM
(SELECT descrip, Amount
FROM Table) AS SourceTable
PIVOT
(
Max(Amount)
FOR descrip IN ([Group1], [Group2], [Group3])
) AS PivotTable;
需要放入適當的聚合函數,對於本示例,我使用了max。
就像SeriousCallersOnly所說的那樣,您需要一個透視語句。 不幸的是,要使用這些值,您必須硬編碼要使用的實際值 (“ Group1”,“ Group2”,“ Group3”等)。 如果直到運行時才能確定它們,則必須在運行時構建查詢,這意味着構建並執行動態代碼。 這並不容易做到。 如果您確實必須做很多這樣的查詢,則必須(必須)做得很好。 如果這是您認為唯一會做的地方,那么最好將應用程序方面的工作付諸實踐。
(另一種可能性:對所有可能的樞軸值進行硬編碼,然后讓應用程序忽略“空”列。如果樞軸值是隨機,任意或用戶輸入的,則此方法不起作用。)
當您想將行數據更改為列(AKA樞軸)時,最廣泛支持的方法是使用CASE語句:
SELECT t.descrip,
CASE WHEN t.descrip LIKE 'GROUP 1%' THEN t.amount END 'Group 1',
CASE WHEN t.descrip LIKE 'GROUP 2%' THEN t.amount END 'Group 2',
CASE WHEN t.descrip LIKE 'GROUP 3%' THEN t.amount END 'Group 3',
...etc
但是,這也意味着,如果您沒有特定說明的記錄,則該值將顯示為NULL
。 SQL是全有或全無的事情-要么該列將出現,要么它不會出現在整個結果集中。
根據您的數據庫,有一些語法可以幫助您。 例如,自SQL Server 2005起,SQL Server就支持PIVOT功能。Oracle在11g中添加了它。 我不認為MySQL或Postgres具有樞軸功能-您必須使用CASE語句。
至於具有動態組,則需要使用動態SQL來適應。 CASE和PIVOT功能都不能處理此問題-必須為查詢定義輸出列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.