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
- 正如@John Cappelletti 所说,您不能在动态 SQL 中使用 table 变量;除非您在数据库中定义了
Table type
或移动到 Temp
table。
- 你的逻辑有问题。我不太确定你想要达到什么目的,但上面的代码为你提供了无错误的输出。
- 您没有在任何地方定义但在
SQL
中使用的 CANTIDAD_CAP
列。
- 你不应该 SELECT 专栏
LAPSO_DOC
你最好研究一下 PIVOT
上的一些在线文章 - 比如 this and this。
编辑:
编码标准
NEVER declare a column name same as table name, and vice versa.
我正在尝试创建一个动态枢轴,但它一直告诉我 "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
- 正如@John Cappelletti 所说,您不能在动态 SQL 中使用 table 变量;除非您在数据库中定义了
Table type
或移动到Temp
table。 - 你的逻辑有问题。我不太确定你想要达到什么目的,但上面的代码为你提供了无错误的输出。
- 您没有在任何地方定义但在
SQL
中使用的CANTIDAD_CAP
列。 - 你不应该 SELECT 专栏
LAPSO_DOC
你最好研究一下 PIVOT
上的一些在线文章 - 比如 this and this。
编辑:
编码标准
NEVER declare a column name same as table name, and vice versa.