在数据透视表中避免重复

时间:2016-11-24 10:59:53

标签: sql sql-server tsql pivot

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

img1

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

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

img2

这是我的代码:

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

表的结构和一些数据:

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分组,我不知道有两个这样做。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

这样的事情怎么样?

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 ...)行移出了正在旋转的表格,因此删除了副本。