在SQL Server中使用平面表结构的数据透视表,无需聚合

时间:2013-12-08 18:34:20

标签: sql-server-2005 pivot

我有一个平面表结构,我已经变成了一个基于列的表。我正在努力将原始数据中的rowId显示在基于列的表中。非常感谢任何帮助。

表中的原始数据来自三个不同的表:

| rowId            |columnName       |ColumnValue  |
| ---------------- |:---------------:| -----------:|
| 1                |itemNo           |1            |
| 1                |itemName         |Polo Shirt   |
| 1                |itemDescription  |Green        |
| 1                |price1           |4.2          |
| 1                |price2           |5.3          |
| 1                |price3           |7.5          |
| 1                |displayOrder     |1            |
| 1                |rowId            |[NULL]       |
| 2                |itemNo           |12           |
| 2                |itemName         |Digital Watch|
| 2                |itemDescription  |Red Watch    |
| 2                |price1           |4.0          |
| 2                |price2           |2.0          |
| 2                |price3           |1.5          |
| 2                |displayOrder     |3            |
| 2                |rowId            |[NULL]       |

SQL使用pivot来给我列结构:

select [displayOrder],[itemDescription],[itemName],[itemNo],[price1],[price2],[price3],[rowId]
 from 
(
SELECT  [columnName], [columnValue] , row_number() over(partition by c.columnName order by cv.rowId) as rn
FROM  tblFlatTable AS t
JOIN tblFlatColumns c
ON t.flatTableId = c.flatTableId
JOIN tblFlatColumnValues cv
ON cv.flatColumnId = c.flatColumnId
WHERE (t.flatTableId = 1) AND (t.isActive = 1) 
AND (c.isActive = 1) AND (cv.isActive = 1)
) as S
Pivot
(
    MIN([columnValue])
    FOR columnName IN ([displayOrder],[itemDescription],[itemName],[itemNo],[price1],[price2],[price3],[rowId])
) as P

结果:

|displayOrder|itemDescription|itemName      |price1|price2|price3|rowId |
| ---------- |:-------------:|:------------:|:----:|:----:|:----:|-----:|
|1           |Green          |Polo Shirt    |4.2   |5.3    |7.5  |[NULL]|
|3           |Red watch      |Digital Watch |4.0   |2.0    |1.5  |[NULL]|

我理解为什么我得到rowId的NULL值。我坚持下去,我不确定是否可以这样做,因为我看了很多例子,似乎没有人这样做,就是从原始数据中提取rowId的值并将其添加到我的结构中

1 个答案:

答案 0 :(得分:0)

现在看起来很明显!

我现在不包括rowId作为我的扁平结构的一部分。

| rowId            |columnName       |ColumnValue  |
| ---------------- |:---------------:| -----------:|
| 1                |itemNo           |1            |
| 1                |itemName         |Polo Shirt   |
| 1                |itemDescription  |Green        |
| 1                |price1           |4.2          |
| 1                |price2           |5.3          |
| 1                |price3           |7.5          |
| 1                |displayOrder     |1            |
| 2                |itemNo           |12           |
| 2                |itemName         |Digital Watch|
| 2                |itemDescription  |Red Watch    |
| 2                |price1           |4.0          |
| 2                |price2           |2.0          |
| 2                |price3           |1.5          |
| 2                |displayOrder     |3            |

我已经更新了SQL,你可以看到我从tblFlatColumnValues拉入rowId

select [rowId],[displayOrder],[itemDescription],[itemName],[itemNo],[price1],[price2],[price3]
 from 
(
SELECT  cv.rowId, [columnName], [columnValue] , row_number() over(partition by c.columnName order by cv.rowId) as rn
FROM  tblFlatTable AS t
JOIN tblFlatColumns c
ON t.flatTableId = c.flatTableId
JOIN tblFlatColumnValues cv
ON cv.flatColumnId = c.flatColumnId
WHERE (t.flatTableId = 1) AND (t.isActive = 1) 
AND (c.isActive = 1) AND (cv.isActive = 1)
) as S
Pivot
(
    MIN([columnValue])
    FOR columnName IN ([displayOrder],[itemDescription],[itemName],[itemNo],[price1],[price2],[price3])
) as P