SQL足够强大吗?

时间:2011-02-25 13:56:41

标签: sql

我们的旧应用程序以下列格式将数据导出到SQL表中

**Row#** | **Column#** | **Parameter** | **Value**

e.g。

1 | 1 | Name  | Michael

1 | 2 | Age   | 30

1 | 3 | email | email@email.com

2 | 1 | Name  | Brian

2 | 2 | Age   | 45

2 | 3 | email | brian@email.com

我只需要使用SQL,就可以返回类似这样的内容

**Name** | **Age** | **email**

Michael  |    30   | email@email.com

Brian    |    45   | brian@email.com

这可能吗?如果是这样,怎么样?更多细节:

  • 列数和列名称是固定的,可以硬编码

  • 行数未固定

4 个答案:

答案 0 :(得分:5)

你可以使用PIVOT,或只是聚合的一些乐趣:

SELECT
    Row#,
    MAX(CASE WHEN Parameter='Name' THEN Value END) as Name,
    MAX(CASE WHEN Parameter='Age' THEN Value END) as Age,
    MAX(CASE WHEN Parameter='email' THEN Value END) as Email
FROM
    Table
group by
    Row#

确切的语法和使用的选项取决于您正在使用的SQL数据库

答案 1 :(得分:2)

您需要PIVOTCROSS TAB查询。您的RDBMS可能对此有特定的支持。如果不是,以下几乎应该在AFAIK的任何地方起作用。

SELECT
       MAX(CASE WHEN Column=1 then Value END) AS Name,
       MAX(CASE WHEN Column=2 then Value END) AS Age,
       MAX(CASE WHEN Column=3 then Value END) AS Email
FROM YourTable
GROUP BY row

答案 2 :(得分:2)

SELECT
        A.Name,
        B.Age,
        C.email
FROM
        myTable A
        LEFT OUTER JOIN myTable B
            ON A.Row = B.Row
                AND B.Parameter = 'Age'
        LEFT OUTER JOIN myTable C
            ON A.Row = C.Row
                AND C.Parameter = 'email'
WHERE
        A.Parameter = 'Name'

根据需要继续使用更多表别名。请注意,如果您的桌子很宽,这可能很难维护。

答案 3 :(得分:2)

因此,您的数据采用Entity-Attribute-Value格式。这并不罕见。

您可以使用一系列连接或数据透视操作将其传输到表格格式。

有关SQL连接方法的信息,请参阅other answers

如果您使用的是SQL Server,执行此操作的SQL Server PIVOT命令将如下所示:

    SELECT Row
    , [Name] 
    , [age] 
    , [email] 
    FROM 
    (
        SELECT [Row], [Parameter], [Value]
        FROM EAV_Data
    ) p
    PIVOT
    (
        MAX ([Value])
        FOR Parameter IN ([Name], [age], [email])
    ) AS pvt