消除数据中心的口是心非 table

evit duplicity in pivot table

我创建了一个 T-SQL 代码来接收这样的数据:

但是当数据位于不同的列(COL1、COL2、COL3、COL5、....)时,这会导致 CODART 和 NOMBRE 重复

我想将所有数据显示在一行中,如下所示:

这是我的代码:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'
SELECT *
FROM
(
  SELECT sum(CUENTA) [cuenta], CODIGO,(select max(ar.nombre) from 
CON.dbo.ARTICULOS ar where ar.codart=a.Codigo) as NOMBRE,
  COL from LIBRO_COLUMNA l group by COL,CODIGO,
) AS j
PIVOT
(
  SUM(cuenta) FOR COL IN('+@columns+')
) AS pivottable ORDER BY CODIGO;';
--PRINT @sql;
exec sp_executesql @sql

table的结构和一些数据:

COL        codigo           nombre                     Cuenta

*--------------------------------------------------------------------

COL5     |  PHOBA802   |    TAPA FINAL D-UT 2,5/10   |  3624.00

COL 5    |  PHOBA8021  |    TAPA FINAL D-UT 16       |  159.00

COL 5    |  PHOBA803   |    TAPA FINAL D-UT 2,5/4    |  1950.00

COL 10   |  PHOBA803   |                             |  447.00

COL 1    |  PHOBA803   |    TAPA UT 2,5-4            |  138.00

这里的问题是,如果想要一个带有 COL 的支点,我需要按 CODIGO 和 COL 分组,我不知道两个不按 COL 分组就可以做到这一点。

有什么建议吗?

这样的怎么样?

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'
SELECT
    subquery.*
    , (select max(ar.nombre) from 
CON.dbo.ARTICULOS ar where ar.codart=subquery.Codigo) as NOMBRE
FROM
(
SELECT *
FROM
(
  SELECT sum(CUENTA) [cuenta],
  COL from LIBRO_COLUMNA l group by COL,CODIGO
) AS j
PIVOT
(
  SUM(cuenta) FOR COL IN('+@columns+')
) AS pivottable

) subquery ORDER BY subquery.CODIGO;
';
--PRINT @sql;
exec sp_executesql @sql

----稍后添加----

关于原因的更多解释。

在 T-SQL Fundamental 和准备 70-461 考试的文本中,Itzik Ben-Gan 解释了 PIVOT。

SELECT <select list>
FROM (
    SELECT
        <grouping column>
        , <spreading column>
        , <aggregating column>
    ) PIVOT ( <aggregate function> (<aggregation column>)
        FOR <spreading column> IN (<spreading values>) ) as P;

根据我对他写作的理解,通过在 (select max...) 行中添加,您在其中添加了一个分组列 (将分组视为 ... GROUP BY 分组列、展开列的一部分)。

在这种情况下,我将 (select max...) 行从要旋转的 table 中移出,因此删除了重复项。