2014-11-22 71 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