2014-11-22 99 views
3

注意:此帖与前一篇文章稍有变化。SQL Server 2008 R2:数据透视表的动态查询,其中有和子句

我有下面的表格,详细信息如下例所示。

表:测试

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'); 

注意:现在我只想显示的记录中, cola属于colc的值。如果用户将colc值作为参数传递给存储过程,那么它必须匹配colc的确切值,它属于哪个值,即cola

预期结果

如果用户通过A1,A2,A6那么结果应该是:

​​

注意:在上述结果的记录101出现,因为它属于A1,A2,A6没有其他值。 201不会出现,因为它也属于A1,A3A5

如果用户通过A1那么结果应该是:

cola A1 
-------- 
401 1 

注意:在上述结果的记录401出现,因为它属于A1

我尝试:

透视查询

获取结果

cola A1 
---------- 
101  1 
401  1 

你可以去这里practicle:

小号QL小提琴:

http://sqlfiddle.com/#!3/9b1fd/4

回答

2

你c应该使用这个:

DECLARE @Stuff varchar(max) = 'A1' 
     DECLARE @Sql varchar(max) 
    DECLARE @totalparam int = 1 
     SET @Sql = 'SELECT cola,' [email protected]+ ' 
        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 ('[email protected]+') 
       )AS pvt' 

    PRINT(@Sql) 
    EXEC(@Sql) 
+0

这不符合预期的结果。请重新检查它。 – MAK 2014-11-23 15:05:26

+0

对不起..我的意思是这个代码:http://sqlfiddle.com/#!3/9b1fd/72 你可以修改它来设置totalparam作为参数。 – 2014-11-23 15:35:16

+0

请检查此:http://sqlfiddle.com/#!3/5298f/1 – MAK 2014-11-23 16:05:45

-1

试试这个。

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 

OUTPUT:

(用于输入字符串 'A1,A2')

+-----+----+----+ 
|cola | A1 | A2 | 
+-----+----+----+ 
|101 | 1 | 1 | 
+-----+----+----+ 

(用于输入字符串 'A1')

+-----+----+ 
|cola | A1 | 
+-----+----+ 
|401 | 1 | 
+-----+----+ 
+0

无论谁投票,请评论为什么它没有用。所以我可以修复 – 2014-11-22 15:11:07

+1

不是我的DV,而是解释代码在做什么以及它为什么起作用会使这个更好的答案。 :) – Taryn 2014-11-22 15:39:47

+0

请重新测试您的脚本,将这些记录插入表中:'101 4234 A5','201 3434 A1','201 3435 A6'。现在通过'@stuff = A1,A2,A5'。请不要删除以前的记录保留这些和这些记录。 – MAK 2014-11-23 06:21:46