Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在SQL Server中使用平面表结构的透视表,无需聚合_Sql Server 2005_Pivot - Fatal编程技术网

Sql server 2005 在SQL Server中使用平面表结构的透视表,无需聚合

Sql server 2005 在SQL Server中使用平面表结构的透视表,无需聚合,sql-server-2005,pivot,Sql Server 2005,Pivot,我有一个平面的表格结构,我把它变成了一个基于列的表格。我正在努力使原始数据中的rowId显示在基于列的表中。非常感谢您的帮助 表中的原始数据来自三个不同的表: | rowId |columnName |ColumnValue | | ---------------- |:---------------:| -----------:| | 1 |itemNo |1 | | 1

我有一个平面的表格结构,我把它变成了一个基于列的表格。我正在努力使原始数据中的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的空值。我一直坚持的是,我不确定是否有可能像我看过的许多例子一样,没有一个能做到这一点,那就是从原始数据中提取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            |
我现在不把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