簡體   English   中英

將“平面” SQL查詢結果轉換為表結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM