【问题标题】:Pivot 3 Columns in SQL在 SQL 中透视 3 列
【发布时间】:2013-01-16 04:15:51
【问题描述】:

您好,我有一个包含 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 列包含所有邮政编码,第 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 中实现这一点 任何帮助表示赞赏

【问题讨论】:

  • 您打算使用什么 DBMS?并非所有人都具有内置的枢轴功能...
  • HI PinnyM 全部在 SQL Server 2008 中

标签: sql sql-server-2008 pivot


【解决方案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 with Demo

两者的结果是:

|  COL_1 | PHO | RAMS | SPHI |
------------------------------
| 521025 |   0 |    7 |    9 |
| 526252 |  10 |    0 |    0 |
| 526256 |   0 |    8 |    0 |

【讨论】:

  • @user1982355 很乐意为您提供帮助,如果此答案或您的问题的任何答案有帮助,请务必通过答案左侧的左侧复选标记接受它。它可以帮助未来的访问者,并且您会因为接受而获得代表。
【解决方案2】:

请检查

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

【讨论】:

  • 您好,非常感谢techdo 的回复。我只是按照您的语法运行查询。。我还可以问在第2 列中,我有350 条不同的记录,有没有我不需要的方法根据您的查询写入所有 350 个名称以透视数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多