Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008 R2:使用where和having子句动态查询数据透视表_Sql Server_Sql Server 2008 R2_Pivot - Fatal编程技术网

Sql server SQL Server 2008 R2:使用where和having子句动态查询数据透视表

Sql server SQL Server 2008 R2:使用where和having子句动态查询数据透视表,sql-server,sql-server-2008-r2,pivot,Sql Server,Sql Server 2008 R2,Pivot,注意:此帖子与以前的帖子略有不同 我有下表,详细信息如下例所示 示例: insert into test values('101','1234','A1'); insert into test values('101','4321','A2'); insert into test values('201','5678','A3'); insert into test values('301','8765','A4'); insert into test values('401','9877','

注意:此帖子与以前的帖子略有不同

我有下表,详细信息如下例所示

示例

insert into test values('101','1234','A1');
insert into test values('101','4321','A2');
insert into test values('201','5678','A3');
insert into test values('301','8765','A4');
insert into test values('401','9877','A1');
 insert into test values('101','9997','A6');
 insert into test values('201','2277','A1');
 insert into test values('201','1577','A5'); 
DECLARE @Stuff varchar(max) = 'A1'
DECLARE @Sql varchar(max)

SET @Sql = 'SELECT cola,' +@Stuff+ '
            from
            (
                select cola,colc
                from test 
                where colc in(''A1'')
                group by cola,colc
                having count(distinct colc) = 1

            )p
            PIVOT
            (
                COUNT(colc)
                FOR colc IN ('+@Stuff+')
            )AS pvt'

PRINT(@Sql)
EXEC(@Sql)      
cola    A1  
----------
101     1
401     1
表格:测试

create table test
(
 cola varchar(10),
 colb varchar(10),
 colc varchar(10)
);
插入

insert into test values('101','1234','A1');
insert into test values('101','4321','A2');
insert into test values('201','5678','A3');
insert into test values('301','8765','A4');
insert into test values('401','9877','A1');
 insert into test values('101','9997','A6');
 insert into test values('201','2277','A1');
 insert into test values('201','1577','A5'); 
DECLARE @Stuff varchar(max) = 'A1'
DECLARE @Sql varchar(max)

SET @Sql = 'SELECT cola,' +@Stuff+ '
            from
            (
                select cola,colc
                from test 
                where colc in(''A1'')
                group by cola,colc
                having count(distinct colc) = 1

            )p
            PIVOT
            (
                COUNT(colc)
                FOR colc IN ('+@Stuff+')
            )AS pvt'

PRINT(@Sql)
EXEC(@Sql)      
cola    A1  
----------
101     1
401     1
注意:现在我只想显示
cola
属于
colc
值的记录。如果用户将
colc
值作为参数传递给存储过程,则它必须匹配
colc
所属的
cola
值的确切值

预期结果

insert into test values('101','1234','A1');
insert into test values('101','4321','A2');
insert into test values('201','5678','A3');
insert into test values('301','8765','A4');
insert into test values('401','9877','A1');
 insert into test values('101','9997','A6');
 insert into test values('201','2277','A1');
 insert into test values('201','1577','A5'); 
DECLARE @Stuff varchar(max) = 'A1'
DECLARE @Sql varchar(max)

SET @Sql = 'SELECT cola,' +@Stuff+ '
            from
            (
                select cola,colc
                from test 
                where colc in(''A1'')
                group by cola,colc
                having count(distinct colc) = 1

            )p
            PIVOT
            (
                COUNT(colc)
                FOR colc IN ('+@Stuff+')
            )AS pvt'

PRINT(@Sql)
EXEC(@Sql)      
cola    A1  
----------
101     1
401     1
如果用户通过
A1、A2、A6
,则结果应为:

cola   A1   A2   A6
--------------------
101    1      1     1
cola   A1 
--------
401    1  
注意:在上述结果中,出现记录
101
,因为它属于
A1、A2、A6
而不是其他值<代码>201不会出现,因为它也属于
A1、A3
A5

如果用户通过
A1
,则结果应为:

cola   A1   A2   A6
--------------------
101    1      1     1
cola   A1 
--------
401    1  
注意:在上述结果中,出现记录
401
,因为它属于
A1

我的尝试: 透视查询

insert into test values('101','1234','A1');
insert into test values('101','4321','A2');
insert into test values('201','5678','A3');
insert into test values('301','8765','A4');
insert into test values('401','9877','A1');
 insert into test values('101','9997','A6');
 insert into test values('201','2277','A1');
 insert into test values('201','1577','A5'); 
DECLARE @Stuff varchar(max) = 'A1'
DECLARE @Sql varchar(max)

SET @Sql = 'SELECT cola,' +@Stuff+ '
            from
            (
                select cola,colc
                from test 
                where colc in(''A1'')
                group by cola,colc
                having count(distinct colc) = 1

            )p
            PIVOT
            (
                COUNT(colc)
                FOR colc IN ('+@Stuff+')
            )AS pvt'

PRINT(@Sql)
EXEC(@Sql)      
cola    A1  
----------
101     1
401     1
获取结果

insert into test values('101','1234','A1');
insert into test values('101','4321','A2');
insert into test values('201','5678','A3');
insert into test values('301','8765','A4');
insert into test values('401','9877','A1');
 insert into test values('101','9997','A6');
 insert into test values('201','2277','A1');
 insert into test values('201','1577','A5'); 
DECLARE @Stuff varchar(max) = 'A1'
DECLARE @Sql varchar(max)

SET @Sql = 'SELECT cola,' +@Stuff+ '
            from
            (
                select cola,colc
                from test 
                where colc in(''A1'')
                group by cola,colc
                having count(distinct colc) = 1

            )p
            PIVOT
            (
                COUNT(colc)
                FOR colc IN ('+@Stuff+')
            )AS pvt'

PRINT(@Sql)
EXEC(@Sql)      
cola    A1  
----------
101     1
401     1
你可以到这里练习:

SQL Fiddle: 试试这个

DECLARE @Stuff VARCHAR(max) = 'A1,A2'--'A1'
DECLARE @Sql NVARCHAR(max),
        @cnt INT

SELECT @cnt = Count(1)
FROM   (SELECT Cast ('<M>' + Replace(@Stuff, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
       CROSS APPLY Data.nodes ('/M') AS Split(a)

SET @Sql = 'SELECT cola,' + @Stuff+ ' from
                (SELECT a.cola, a.colc
                 FROM   test a
                 JOIN (SELECT cola
                 FROM   test
                 GROUP  BY cola
                 HAVING Count(DISTINCT colc) = '
           + CONVERT(VARCHAR(30), @cnt)+ ') B
                 ON a.cola = b.cola
                 where colc in (select rtrim(ltrim(Split.a.value(''.'', ''VARCHAR(100)'')))
FROM   (SELECT Cast (''<M>'' + Replace('''
           + @Stuff + ''', '','', ''</M><M>'') + ''</M>'' AS XML) AS Data) AS A
       CROSS APPLY Data.nodes (''/M'') AS Split(a) )
                )p
                PIVOT
                (COUNT(colc) FOR colc IN (' + @Stuff+ ')
                )AS pvt'

EXEC Sp_executesql @Sql 
(用于输入字符串“A1”)

你可以用这个:

DECLARE @Stuff varchar(max) = 'A1'
        DECLARE @Sql varchar(max)
    DECLARE @totalparam int = 1
        SET @Sql = 'SELECT cola,' +@Stuff+ '
                    from
                    (
                        select cola,colc
                        from test a
                        where colc in(''A1'')
                        group by cola,colc
                        having (select count(colc) from test b where b.cola = a.cola )  = @totalparam

                    )p
                PIVOT
                (
                    COUNT(colc)
                    FOR colc IN ('+@Stuff+')
                )AS pvt'

    PRINT(@Sql)
    EXEC(@Sql)  

无论谁投了反对票,请评论为什么它没有用。因此,我不能修复我的DV,但解释代码正在做什么以及它为什么工作,这将是一个更好的答案。:)请将这些记录插入表中,重新测试脚本:
101 4234 A5
201 3434 A1
201 3435 A6
。现在通过
@stuff=A1、A2、A5
。请不要删除以前的记录保留这些记录和这些记录。这不符合预期结果。请再检查一下,对不起。。我的意思是:你可以修改它,将totalparam设置为参数。不!完全错了。如果输入为
A1、A2、A6
,则必须返回记录
101
,并提供详细信息。是的,确实如此。你检查结果了吗?在底部。请检查结果。细节是101。此外,您可以修改列表和total参数:如果输入为“A1,A3”,我将优化查询: