1

私は次の表を持っています:

    id     name     year     month     value     code
    1      George   1991       1       675       1234
    2      George   1991       2       675       1234
    3      George   1991       2       675       1234
    5      George   1991       3       675       1234
    ...    ...      ...       ...      ...       ...

しかし、私はそれをこのように表示する必要があるので、1つのIDで何ヶ月も続けて持つことができます:

    id     year     name     code     jan     feb     mar     apr   ...  dec
    1      1991     George   1234     675     675     675      0          0
    2      1991     George   1234      0      675      0       0          0
    ...    ...      ...      ...      ...     ...     ...     ...   ...  ...

つまり、同じ月に複数の値が存在する可能性があり、値を合計せずにその構造を作成することはできません(この例では、2月)。これは望ましくありません。ピボットなどを使用してこれを行う方法はありますか?

4

2 に答える 2

3

一意性を維持したい月ごとに複数の値がある場合は、 :row_number()を使用する前に事前に適用することを検討する必要があります。PIVOT

select name, year, code,
  coalesce([1], 0) as jan,
  coalesce([2], 0) as feb,
  coalesce([3], 0) as mar
from
(
  select name, year, month, value, code,
    row_number() over(partition by name, year, month
                      order by year, month) rn
  from yourtable
) src
pivot
(
  max(value)
  for month in ([1], [2], [3])
) piv

SQL FiddlewithDemoを参照してください

結果は次のとおりです。

|   NAME | YEAR | CODE | JAN | FEB | MAR |
------------------------------------------
| George | 1991 | 1234 | 675 | 675 | 675 |
| George | 1991 | 1234 |   0 | 675 |   0 |
于 2013-02-18T17:52:00.340 に答える
1

PIVOTを使用すると何が問題になりますか?

この種のクエリを使用すると、ID、NAME、CODE、YEAR、およびMONTHの間に一意性がある場合に、除外している結果が得られます。

select id, name, code, year,
        [1] as JAN,
        [2] as FEB,
        ...
        [11] as NOV,
        [12] as DEC
from (
        select id, name, code, year, month, value
        from <table>
    )
pivot (
    max (value) for month in ([1],[2], ... [11],[12])
)
于 2013-02-18T17:49:07.003 に答える