【问题标题】:How to pivot data group by condition in SQL Server?如何在 SQL Server 中按条件透视数据组?
【发布时间】:2015-11-16 06:20:16
【问题描述】:

我有如下数据(全部在 PRODUCT_STATUS 表中)

CatID   ProductID    Active
C01    P001         True
C01    P002         False
C01    P003         True
C02    P001         False
C01    P004         False

现在,我想要如下所示的枢轴,在这里:使用参数 C01,按 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

我运行 store GET_GROUP_STATUS C01 ,但似乎它不起作用。

【问题讨论】:

  • 你运行后的结果是什么?

标签: sql-server tsql stored-procedures pivot


【解决方案1】:

我设法运行它,但首先提示:

  1. 不要粘贴一些代码,说它不起作用,等待有人修复它。
  2. 如果您按照 1) 进行操作,请准备环境以重现错误,例如使用 Sql Fiddle,这样会更容易提供帮助。
  3. 努力描述您想要实现的目标,而不仅仅是数据 => 结果
  4. 回答 cmets。
  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' -- 为此,您将获得 (null) 产品 [P002-P004]

对于任何想要play with it的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多