2015-10-24 112 views
1

我有2個表,一個與需要計數列名的列表,以及一個與數據進行計數選擇基於列名來自另一個選擇(EVAL?)

Table A 
ProgramId ColumnName 
1   Country 
1   Gender 
2   AgeRange 
2   Region 

Table B 
ProgramId Country Gender AgeRange Region 
1   USA  M  18-25  Midwest 
1   USA  F  <18  Northeast 
1   MEX  M  <18  South 
2   USA  M  18-25  Midwest 
2   USA  M  26-35  Midwest 

鑑於AA具體ProgramId我需要從表A中與每個值加入每一列的列表,並從表B中計數

實施例輸出需要(參數:@ProgramId = 1)

ColumnName ColumnValue ValueCount 
Country  USA   2 
Country  MEX   1 
Gender  M   2 
Gender  F   1 

從我已經能夠找到googlin克,我需要一些動態的陳述。這對我來說很好,因爲只有訪問表A的人才是內部開發人員。

+0

你只需要根據輸入來創建動態SQL子句和使用sp_executesql –

回答

1

SQL Fiddle

MS SQL Server 2008的架構設置

CREATE TABLE TableA (ProgramId INT, ColumnName VARCHAR(20)) 
INSERT INTO TableA VALUES 
(1   ,'Country'), 
(1   ,'Gender'), 
(2   ,'AgeRange'), 
(2   ,'Region') 


CREATE TABLE TableB (ProgramId VARCHAR(20), Country VARCHAR(20), 
     Gender VARCHAR(20), AgeRange VARCHAR(20), Region VARCHAR(20)) 
INSERT INTO TableB VALUES 
('1'   ,'USA'  ,'M'  ,'18-25'  ,'Midwest'), 
('1'   ,'USA'  ,'F'  ,'<18'  ,'Northeast'), 
('1'   ,'MEX'  ,'M'  ,'<18'  ,'South'), 
('2'   ,'USA'  ,'M'  ,'18-25'  ,'Midwest'), 
('2'   ,'USA'  ,'M'  ,'26-35'  ,'Midwest') 

查詢1

;With x AS 
(
Select * 
From TableB 
     UNPIVOT(ColumnValue FOR ColumnName IN (Gender, Country))up 
) 
Select x.ColumnName 
     ,x.ColumnValue 
     ,COUNT(x.ColumnValue) ValueCount 
From x 
inner join TableA a ON x.ColumnName = a.ColumnName 
WHERE x.ProgramId = 1 --<-- or maybe the parameter @ProgramId 
GROUP BY x.ColumnName,x.ColumnValue 

Results

| ColumnName | ColumnValue | ValueCount | 
|------------|-------------|------------| 
| Country |   MEX |   1 | 
| Country |   USA |   2 | 
|  Gender |   F |   1 | 
|  Gender |   M |   2 | 
+0

執行它謝謝,這正是我需要的東西,看 – Ben

+0

剛說完,只需要改變就是從TableA的列中構建一個varchar作爲逗號分隔列表,並將整個事件包裝在EXEC中,用我的構建變量替換Gender,Country – Ben

0

第一步是生成代碼。第二個是運行它。

假設你列沒有特別的名稱或奇怪的字符:

select @sql = ('select ' + cols + 
       ', count(*) as ValueCount from b group by ' + cols 
      ) 
from (select stuff((select ', ' + a.ColumnName 
        from a 
        where programid = @programid 
        for xml path ('') 
        ), 1, 2, '' 
       ) as cols 
    ) x; 

exec sp_executesql @sql;