我们的旧应用程序以下列格式将数据导出到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
这可能吗?如果是这样,怎么样?更多细节:
列数和列名称是固定的,可以硬编码
行数未固定
答案 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)
您需要PIVOT
或CROSS 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 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