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

我想对数据进行透视,以便在 excel(以矩阵形式排序)中轻松使用数据,其中 1 列包含所有邮政编码,第一行包含所有商店名称,并且在邮政编码和商店名称的交点处是相应的距离。我可以使用 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 回答