我已经创建了一个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
表的结构和一些数据:
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分组,我不知道有两个这样做。
有什么建议吗?
答案 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 ...)行移出了正在旋转的表格,因此删除了副本。