2

こんにちは、140 万レコードのテーブルがあります。テーブル構造は以下の通り

Col_1 INT, -- this column has post Codes
Col_2 VARCHAR, -- This Column Shop Names 
Col_3 MONEY, -- this column has distance from every Shop Name to post code with in 50 KM radius.

Total distinct post shop names are = 350
Total Distinct post codes are = 50,000

データをピボットして、1 列にすべての郵便番号があり、1 行目にすべての店名があり、郵便番号と店名の交点が対応する距離である Excel (一種のマトリックス形式) で簡単に消費されるようにします。powerpivot を使用してデータをピボットできますが、レコード数が原因で毎回クラッシュします。

表の例:

1. Col_1    Col_2  Col_3
2. 521025   Rams   7
3. 526256   Rams   8
4. 521025   SPhi   9
5. 526252   pho    10

必要な出力

1. PostCode Rams  Sphi  Pho
2. 521025   7     9     0
3. 526256   8     0     10

SQLでこれを達成するにはどうすればよいですか

4

2 に答える 2

1

行から列へのこのタイプの変換は、 として知られていPIVOTます。SQL Server 2005+ では、このローテーションを実行できる関数が追加されました。

事前に値がわかっている場合は、静的ピボットを使用してそれらをハードコーディングできます。

select col_1, 
  IsNull(Rams, 0) Rams, 
  IsNull(Sphi, 0) Sphi, 
  IsNull(pho, 0) Pho
from
(
  select col_1, col_2, col_3
  from yourtable
) src
pivot
(
  sum(col_3)
  for col_2 in (Rams, Sphi, Pho)
) piv

SQL Fiddle with Demoを参照してください。

ただし、列に転置する必要がある値の数が不明な場合は、動的 SQL を使用してこれを実行できます。

DECLARE @cols AS NVARCHAR(MAX),
    @colsNull AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col_2) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsNull = STUFF((SELECT distinct ', IsNull(' + QUOTENAME(col_2)+', 0) as '+QUOTENAME(col_2)
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT col_1,' + @colsNull + ' from 
             (
                select col_1, col_2, col_3
                from yourtable
            ) x
            pivot 
            (
                sum(col_3)
                for col_2 in (' + @cols + ')
            ) p '

execute(@query)

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

両方の結果は次のとおりです。

|  COL_1 | PHO | RAMS | SPHI |
------------------------------
| 521025 |   0 |    7 |    9 |
| 526252 |  10 |    0 |    0 |
| 526256 |   0 |    8 |    0 |
于 2013-01-16T10:15:13.830 に答える
0

チェックしてください

SELECT 
    Col_1 AS PostCode, 
    ISNULL(Rams, 0) Rams, 
    ISNULL(Sphi, 0) Sphi, 
    ISNULL(Pho, 0)Pho
FROM(
    SELECT Col_1, Col_2, Col_3 FROM YourTable
)UP
PIVOT(SUM(Col_3) FOR Col_2 IN (Rams, Sphi, Pho)) AS PVT
于 2013-01-16T04:33:10.083 に答える