如何在 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. 不要贴一些代码,说不行,等人修。
  2. 如果您按照 1) 中的步骤操作,例如使用 Sql Fiddle 准备重现错误的环境,将更容易提供帮助。
  3. 努力描述您想要实现的目标,而不仅仅是数据 => 结果
  4. 回复评论。
  5. 描述您遇到的错误。

答案如下:

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 的人。