3

これは私のテーブルです。数字が斜めに来ています。

Engineering  Financials  Scope  Schedule  Risks  People
--------------------------------------------------------
1            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        0      NULL      NULL   NULL
NULL         NULL        NULL   0         NULL   NULL
NULL         NULL        NULL   NULL      0      NULL
2            NULL        NULL   NULL      NULL   NULL
NULL         4           NULL   NULL      NULL   NULL
NULL         NULL        3      NULL      NULL   NULL
NULL         NULL        NULL   4         NULL   NULL
NULL         NULL        NULL   NULL      4      NULL
NULL         NULL        NULL   NULL      NULL   0
0            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        0      NULL      NULL   NULL
NULL         NULL        NULL   0         NULL   NULL
NULL         NULL        NULL   NULL      0      NULL
NULL         NULL        NULL   NULL      NULL   0
0            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        0      NULL      NULL   NULL
NULL         NULL        NULL   0         NULL   NULL
NULL         NULL        NULL   NULL      0      NULL
NULL         NULL        NULL   NULL      NULL   0
1            NULL        NULL   NULL      NULL   NULL
NULL         0           NULL   NULL      NULL   NULL
NULL         NULL        5      NULL      NULL   NULL
NULL         NULL        NULL   4         NULL   NULL
NULL         NULL        NULL   NULL      3      NULL
NULL         NULL        NULL   NULL      NULL   3

私はそれらがこの出力に来ることを望みます:

Engineering  Financials  Scope  Schedule  Risks  People
--------------------------------------------------------
1            0           0      0         0      NULL
2            4           3      4         4      0
0            0           0      0         0      0
0            0           0      0         0      0
0            0           0      0         0      0
1            0           5      4         3      3

実際には、これらの斜めの行をセクションごとに 1 つの行に変換したいと考えています。

4

2 に答える 2

4

これはコメントするには長すぎるので、私は答えています。

それがデータのテーブルであるか、クエリからのものであるかどうか、データがどこから来ているかは明確ではありません。あなたの前の質問は a に関するもので、PIVOTあなたが提供したデータはその同じデータと一致するので、これはそのクエリから来ていると推測します.

クエリを使用してPIVOTいて、サブクエリ内のフィールドが多すぎる場合、このタイプの動作が発生する可能性があります。

サンプル データ クエリ 1 :

CREATE TABLE yourtable ([Name] varchar(11), [Rating] int);

INSERT INTO yourtable ([Name], [Rating])
VALUES
    ('Engineering', 1),
    ('Financials', 3),
    ('Scope', 1),
    ('Schedule', 2),
    ('Risks', 3),
    ('People', 3);

正しい結果を提供するPIVOT

select *
from
(
  select name, rating
  from yourtable
) src
pivot
(
  max(rating)
  for name in ([Engineering], [Financials], [Scope],
               [Schedule], [Risks], [People])
) piv

デモで SQL Fiddle を参照してください

結果は次のとおりです。

| ENGINEERING | FINANCIALS | SCOPE | SCHEDULE | RISKS | PEOPLE |
----------------------------------------------------------------
|           1 |          3 |     1 |        2 |     3 |      3 |

エントリに 1 つの行があるため、上記は正しい構文です。このクエリを少し変更すると、違いがわかります。

サンプル データ クエリ 2id : これにフィールドを追加しました

CREATE TABLE yourtable([Name] varchar(11), [Rating] int, id int);

INSERT INTO yourtable([Name], [Rating], id)
VALUES
    ('Engineering', 1, 1),
    ('Financials', 3, 2),
    ('Scope', 1, 3), 
    ('Schedule', 2, 4),
    ('Risks', 3, 5),
    ('People', 3, 6);

実行してPIVOTこのフィールドを含めるとID、結果はあなたのもののようになります。

ピボット:

select [Engineering], [Financials], [Scope], [Schedule], [Risks], [People]
from
(
  select name, rating, id  -- notice the addition of the id column
  from yourtable
) src
pivot
(
  max(rating)
  for name in ([Engineering], [Financials], [Scope],
               [Schedule], [Risks], [People])
) piv

デモで SQL Fiddle を参照してください

結果:

| ENGINEERING | FINANCIALS |  SCOPE | SCHEDULE |  RISKS | PEOPLE |
------------------------------------------------------------------
|           1 |     (null) | (null) |   (null) | (null) | (null) |
|      (null) |          3 | (null) |   (null) | (null) | (null) |
|      (null) |     (null) |      1 |   (null) | (null) | (null) |
|      (null) |     (null) | (null) |        2 | (null) | (null) |
|      (null) |     (null) | (null) |   (null) |      3 | (null) |
|      (null) |     (null) | (null) |   (null) | (null) |      3 |

ご覧のとおり、この余分な列を追加すると、発生している問題が再現されます。私の提案は、テーブル構造を投稿してから、結果を取得するために使用しているクエリを投稿することです。これから、私たちはあなたを助けることができるでしょう.

于 2012-12-07T10:40:10.130 に答える
4

結果として必要な集計は、テーブル内の行の順序に基づいているようです。テーブルでは、行の順序は重要ではなく、順序が同じままであると想定するのは危険です。

そのため、完全なソース テーブル (たとえばSection列を含む) をまだ見せていない限り、この質問に対する有益な回答を提供することは困難です。


編集:

列がある場合Section、次のクエリを使用して目的の結果を取得できます。

SELECT   Section
         ,SUM(Engineering) AS Engineering
         ,SUM(Financials) AS Financials
         ,SUM(Scope) AS Scope
         ,SUM(Schedule) AS Schedule
         ,SUM(Risks) AS Risks
         ,SUM(People) AS People
FROM     YourTable
GROUP BY Section;

SUM関数を使用してデータを集計する代わりにMAX、データとそこから得たいものに応じて、または別の関数を使用することもできます。

于 2012-12-07T09:54:46.917 に答える