【问题标题】:Using Pivot in SQL在 SQL 中使用数据透视
【发布时间】:2009-03-23 21:50:34
【问题描述】:

例如我有一张桌子

IPPARSED
127
0
0
1

现在我需要旋转表格,让它变成这样

1       2   3   4
127   0   0   1

你能帮我怎么做吗?

【问题讨论】:

  • 如果可以的话,您可能需要重新编写解析 IP 地址的方法。通过将它们按顺序放置在表中,这样就破坏了关系数据库的设计规则。由于每个八位位组相互关联,因此您应该将它们作为单行返回,其中包含四列。

标签: sql-server pivot


【解决方案1】:

假设行总是按该顺序排列,您可以尝试使用 case 语句来透视表:

SELECT (case when (<condition to match first octet>) then IPPARSED else END) as 1,
       (case when (<condition to match second octet>) then IPPARSED else END) as 2,
       (case when (<condition to match third octet>) then IPPARSED else END) as 3,
       (case when (<condition to match fourth octet>) then IPPARSED else END) as 4
FROM <insert_table_name_or_table_definition_here>

参照。 Anthony Mollinaro 的 SQL Cookbook 第 365 页。


编辑:如果您在提出&lt;condition to match (...) octet&gt; 时遇到问题,您需要对查询结果进行选择操作,以某种方式将行号添加到您的表中。在 Oracle 中,您将使用 rownum 伪列,但在 SQL Server 中不存在。看来,在 SQL Server 2005 中,您可以使用 ROW_NUMBER() 内置函数作为列,或者可能使用 IDENTITY(...) 函数作为该查询中的列。

【讨论】:

    【解决方案2】:

    您好,您的表中没有另一列来汇总 IP 地址吗? 您不应该在没有任何其他组列的情况下每条记录只有一个整数,对吗? 你用什么数据库?

    【讨论】:

    • SQL Server 2005,是的,自从我在解析方法期间,我只有 1 列
    • 但是你如何区分表中的几个条目呢?以下2个地址怎么写:127.0.0.1和127.0.0.2?
    【解决方案3】:

    我认为当解析的 IP 出现四行时,您正在做一些奇怪的事情。直接解析为一行应该很容易。您能否提供您的解析方法和/或输入格式?

    【讨论】:

      【解决方案4】:

      我同意sheepsimulator 的回答,但是正如您对我的回答David 所评论的那样,如果您没有分组列并且表中有多个条目,则很难找到匹配的条件。 如果您只有一个 IP 条目(所以 4 行),那么您可以:

      • 使用 lineID(Oracle 中的 rownum)进行分组
      • 解析 4 行 ;-)

      编辑:第一个解决方案(使用 lineID)可用于解析多个 IP 条目,但它需要在 DB 中顺序插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 2017-01-17
        • 2020-12-24
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多