0

次のような結果を返す 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 を 1 回使用し、group4 を使用せずに group5 をもう 1 回使用することができます。

.Net コードでこれを実行できることはわかっていますが、コードでは時間がかかります。結果セットにバインドするだけで、SQLサーバーでそれを行うことをお勧めします。

余談ですが、値をロールアップして総計 (Group1 の場合は 5.88 など) を最下部に表示する方法があれば、それは素晴らしいことです。実行時に計算を実行できますが、可能であればサーバー側でも実行したいと考えています。

4

3 に答える 3

0

行データを列に変更する場合 (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 は SQL Server 2005 以降、PIVOT 関数をサポートしています。Oracle は 11g で追加しました。MySQL や Postgres にピボット機能があるとは思えません。CASE ステートメントを使用する必要があります。

動的グループを持つことに関しては、動的 SQL を使用して対応する必要があります。CASE 機能も PIVOT 機能もこれを処理できません。クエリに対して出力列を定義する必要があります。

于 2009-10-12T16:04:43.400 に答える
0

SeriousCallersOnly が言ったように、ピボット ステートメントが必要です。残念ながら、それらを使用するには、ピボットする実際の値(「Group1」、「Group2」、「Group3」など) をハードコーディングする必要があります。実行時まで決定できない場合は、実行時にクエリを作成する必要があります。これは、動的コードを作成して実行することを意味します。これを行うのは簡単ではありません。この種のクエリを何度も実行する必要がある場合は、かなり上手になる必要があります。これが唯一の場所だと思う場合は、アプリケーション側に作業を任せた方がよいかもしれません。

(別の可能性: 可能なすべてのピボットされた値をハードコーディングし、アプリケーションが「空の」列を無視するようにします。ピボットされた値がランダム、任意、またはユーザーが入力した場合、これは機能しません。)

于 2009-10-12T15:43:22.680 に答える