3

MS SQL 2008 を使用しています。テーブルは次のようになります。

| Name  | Code | Amt  |
| ----- | ---- | ---- |
| April |  A   | 1.23 |
| Barry |  A   | 2.34 |
| Barry |  B   | 3.45 |
| Cliff |  A   | 4.56 |
| Cliff |  B   | 5.67 |
| Cliff |  C   | 6.78 |

出力を次のようにする必要があります。

| Name  | Code_A | Code_B | Code_C |
| ----- | ------ | ------ | ------ |
| April |  1.23  |  NULL  |  NULL  |  
| Barry |  2.34  |  3.45  |  NULL  |
| Cliff |  4.56  |  5.67  |  6.78  |

NULL はゼロにすることができます。

自己結合を使用すると、Cliff を取得できますが、Barry と April を取得できません。これは、3 つの条件すべてが利用可能な場合にのみ出力するこのようなものを使用しているためです。

SELECT     a.Name, a.Amt Code_A, b.Amt Code_B, c.Amt Code_C
FROM       Table_1 as c INNER JOIN
                  Table_1 AS b ON c.Name = b.Name INNER JOIN
                  Table_1 AS a ON b.Name = a.Name 
WHERE     (a.Code = 'A') AND (b.Code = 'B') AND (c.Code = 'C')
4

2 に答える 2

4

s の代わりに、ここでは a の方が適切JOINだと思います。PIVOT

SELECT 
    Name, 
    [A] AS Code_A, 
    [B] AS Code_B, 
    [C] AS Code_C
FROM (
    SELECT Name, Code, Amount
    FROM Table_1
) t
PIVOT (
    SUM(Amount)
    FOR Code IN ([A], [B], [C])
) AS pvt
于 2012-04-25T16:34:33.467 に答える
2

完全にSQLエンジンに依存しない方法は次のとおりです。

select names.Name, 
   (select sum(a2.Amt) from amounts a2
    where a2.Name = names.Name
       and a2.Code = 'A') as AmtA,
   (select sum(a3.Amt) from amounts a3
    where a3.Name = names.Name
       and a3.Code = 'B') as AmtB,
   (select sum(a4.Amt) from amounts a4
    where a4.Name = names.Name
       and Code = 'C') as AmtC
from (select distinct Name from amounts) as names

名前の一意のセットを選択し、特定のコードごとに金額を合計します。これは、SQL がどのように機能するかを説明することを目的としています。

実際には、あなたのケースではこれを実際には使用しませんPIVOT。これをサポートするエンジンにとっては、はるかに効率的です。ここに示すように: http://sqlfiddle.com/#!3/7cb0a/5

于 2012-04-25T16:40:03.670 に答える