如何在 SQL 服务器中按条件对数据进行分组?
How to pivot data group by condition in SQL Server?
我有一个数据如下(全部在table PRODUCT_STATUS)
CatID ProductID Active
C01 P001 True
C01 P002 False
C01 P003 True
C02 P001 False
C01 P004 False
现在,我想要如下所示的枢轴,在这里:使用参数 C01,select 按 C01 分组。
CatID P001 P002 P003 P004
C01 1 0 1 0
我用
create PROC GET_GROUP_STATUS @GID CHAR(3)
AS
BEGIN
DECLARE @ColumnHeaders VARCHAR(MAX)
SET @ColumnHeaders = STUFF( (SELECT ', [' + ProductID + ']'
FROM PRODUCT_STATUS
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
, 1, 2, '');
DECLARE @SQL NVARCHAR(MAX)
SET @SQL =
'SELECT * FROM
(
SELECT CatID, ProductID , CAST(ALLOW AS INT) AS ALLOW
FROM PRODUCT_STATUS
WHERE CatID = @GID
) t
PIVOT
(
MAX([ALLOW]) FOR [ALLOW] IN (' + @ColumnHeaders + ')
) p';
--PRINT @SQL
EXEC sp_executesql @SQL, N'@GID CHAR(3)', @GID
END
我 运行 存储 GET_GROUP_STATUS C01 ,但似乎不起作用。
我设法 运行 这个,但首先提示:
- 不要贴一些代码,说不行,等人修。
- 如果您按照 1) 中的步骤操作,例如使用 Sql Fiddle 准备重现错误的环境,将更容易提供帮助。
- 努力描述您想要实现的目标,而不仅仅是数据 => 结果
- 回复评论。
- 描述您遇到的错误。
答案如下:
CREATE PROCEDURE [dbo].[GET_GROUP_STATUS]
@GID CHAR(3)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ColumnHeaders VARCHAR(MAX);
SET @ColumnHeaders = STUFF( (SELECT DISTINCT ', [' + ProductID + ']'
FROM PRODUCT_STATUS
/*WHERE CatId = @GID */
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
, 1, 2, '');
DECLARE @SQL NVARCHAR(MAX) = 'SELECT CatId, ' + @ColumnHeaders + ' FROM
(
SELECT CatID, ProductId, [Active] = (CASE WHEN Active = ''True'' THEN 1 ELSE 0 END)
FROM [dbo].[PRODUCT_STATUS]
WHERE CatID = @GID
) t
PIVOT
(
MAX([Active]) FOR [ProductId] IN (' + @ColumnHeaders + ')
) p';
EXEC [dbo].[sp_executesql] @SQL, N'@GID CHAR(3)', @GID;
END
用法:
EXECUTE [dbo].[GET_GROUP_STATUS] @GID = 'C01'
-- 随你答
发布
EXECUTE [dbo].[GET_GROUP_STATUS] @GID = 'C02'
-- 为此,您将获得产品 [P002-P004]
的 (null)
任何想要 play with it 的人。
我有一个数据如下(全部在table PRODUCT_STATUS)
CatID ProductID Active
C01 P001 True
C01 P002 False
C01 P003 True
C02 P001 False
C01 P004 False
现在,我想要如下所示的枢轴,在这里:使用参数 C01,select 按 C01 分组。
CatID P001 P002 P003 P004
C01 1 0 1 0
我用
create PROC GET_GROUP_STATUS @GID CHAR(3)
AS
BEGIN
DECLARE @ColumnHeaders VARCHAR(MAX)
SET @ColumnHeaders = STUFF( (SELECT ', [' + ProductID + ']'
FROM PRODUCT_STATUS
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
, 1, 2, '');
DECLARE @SQL NVARCHAR(MAX)
SET @SQL =
'SELECT * FROM
(
SELECT CatID, ProductID , CAST(ALLOW AS INT) AS ALLOW
FROM PRODUCT_STATUS
WHERE CatID = @GID
) t
PIVOT
(
MAX([ALLOW]) FOR [ALLOW] IN (' + @ColumnHeaders + ')
) p';
--PRINT @SQL
EXEC sp_executesql @SQL, N'@GID CHAR(3)', @GID
END
我 运行 存储 GET_GROUP_STATUS C01 ,但似乎不起作用。
我设法 运行 这个,但首先提示:
- 不要贴一些代码,说不行,等人修。
- 如果您按照 1) 中的步骤操作,例如使用 Sql Fiddle 准备重现错误的环境,将更容易提供帮助。
- 努力描述您想要实现的目标,而不仅仅是数据 => 结果
- 回复评论。
- 描述您遇到的错误。
答案如下:
CREATE PROCEDURE [dbo].[GET_GROUP_STATUS]
@GID CHAR(3)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ColumnHeaders VARCHAR(MAX);
SET @ColumnHeaders = STUFF( (SELECT DISTINCT ', [' + ProductID + ']'
FROM PRODUCT_STATUS
/*WHERE CatId = @GID */
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
, 1, 2, '');
DECLARE @SQL NVARCHAR(MAX) = 'SELECT CatId, ' + @ColumnHeaders + ' FROM
(
SELECT CatID, ProductId, [Active] = (CASE WHEN Active = ''True'' THEN 1 ELSE 0 END)
FROM [dbo].[PRODUCT_STATUS]
WHERE CatID = @GID
) t
PIVOT
(
MAX([Active]) FOR [ProductId] IN (' + @ColumnHeaders + ')
) p';
EXEC [dbo].[sp_executesql] @SQL, N'@GID CHAR(3)', @GID;
END
用法:
EXECUTE [dbo].[GET_GROUP_STATUS] @GID = 'C01'
-- 随你答
发布
EXECUTE [dbo].[GET_GROUP_STATUS] @GID = 'C02'
-- 为此,您将获得产品 [P002-P004]
任何想要 play with it 的人。