SQL服务器:这个动态枢轴有什么问题?

SQL Server: What's wrong with this dynamic pivot?

我正在尝试创建一个动态枢轴,但它一直告诉我 "you must declare the table variable @venta"。

这是代码,我做错了什么?

DECLARE @venta TABLE
(
    LAPSO_DOC CHAR(6),
    ID_EXT_ITM CHAR(3),
    ID_TALLA CHAR(6),
    VENTA INT
)

INSERT INTO @venta
VALUES 
('201601', 'VER', 'L', '20'),
('201603', 'ROJ', 'XL', '40'),
('201604', 'NEG', 'S', '60'),
('201608', 'BLA', 'M', '80');


DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
    SELECT @columns=STUFF ((SELECT DISTINCT'],['+ LAPSO_DOC
    FROM @venta
    GROUP BY '],['+LAPSO_DOC FOR XML PATH('') ),1,2,'')+']'

    SET @sql = 'SELECT
    (
        SELECT LAPSO_DOC,ID_EXT_ITM,ID_TALLA,VENTA 
        FROM @venta
) 
PIVOT
(
  SUM(CANTIDAD_CAP) FOR LAPSO_DOC IN ('+@columns+')
) AS y;';
EXECUTE (@sql)

这是一个范围问题。

table 变量不可用于动态 sql

也许把它降到一个温度 table

您的查询问题比您预期的要多...

CREATE TABLE #venta (
    LAPSO_DOC char(6),
    ID_EXT_ITM char(3),
    ID_TALLA char(6),
    VENTA int
)

INSERT INTO #venta
    VALUES ('201601', 'VER', 'L', '20'),
    ('201603', 'ROJ', 'XL', '40'),
    ('201604', 'NEG', 'S', '60'),
    ('201608', 'BLA', 'M', '80');


DECLARE @columns nvarchar(max),
        @sql nvarchar(max);
SELECT
    @columns = STUFF((SELECT DISTINCT
        '],[' + LAPSO_DOC
    FROM #venta
    GROUP BY '],[' + LAPSO_DOC
    FOR xml PATH (''))
    , 1, 2, '') + ']'

SET @sql = 'SELECT ID_EXT_ITM,ID_TALLA,' + @columns + '
            FROM #venta
            PIVOT
            (
              SUM(VENTA) FOR LAPSO_DOC IN (' + @columns + ')
            ) AS y;';


EXEC (@sql)

DROP TABLE #venta
  1. 正如@John Cappelletti 所说,您不能在动态 SQL 中使用 table 变量;除非您在数据库中定义了 Table type 或移动到 Temp table。
  2. 你的逻辑有问题。我不太确定你想要达到什么目的,但上面的代码为你提供了无错误的输出。
  3. 您没有在任何地方定义但在 SQL 中使用的 CANTIDAD_CAP 列。
  4. 你不应该 SELECT 专栏 LAPSO_DOC

你最好研究一下 PIVOT 上的一些在线文章 - 比如 this and this


编辑:

编码标准

NEVER declare a column name same as table name, and vice versa.