2016-03-10 1 views
0

Я хочу подсчитать, сколько раз люди выбрали определенную опцию в поле выбора (представленное как -элемент с параметрами на веб-странице).Динамический SQL: как я могу получить данные из трех разных таблиц и подсчитать результаты?

Название полей выбора хранится в таблице CodeType.

> select [CodeTypeID] from [CodeType] where [Name] = 'Favorite Fruit' 

CodetypeID 
---------- 
1000210 

я могу найти выбор, запрашивая CodytypeID -стол по найденному CodetypeID:

> select [ArtifactID], [Name] from [Code] where [CodetypeID] = '1000210' 

ArtifactID Name 
------------------- 
1039477  Apple 
1039478  Pear 
1039479  Banana 
1039912  Peach 

Каждое поле выбора имеет отдельную таблицу (с именем CodeArtifact_XXXX где XXXX является CodetypeID найденное выше). Путем подсчета количества строк для каждого варианта (идентифицированной CodeArtifactID) Я могу видеть, сколько раз был выбран выбор:

> select 
> count(case when [CodeArtifactID] = '1039477' then 1 else null end) as 'Apple' 
> count(case when [CodeArtifactID] = '1039478' then 1 else null end) as 'Pear' 
> count(case when [CodeArtifactID] = '1039479' then 1 else null end) as 'Banana' 
> count(case when [CodeArtifactID] = '1039477' then 1 else null end) as 'Peach' 
> from 
> [CodeArtifact_1000210] 

Apple Pear Banana Peach 
------------------------------- 
12  0  7   4 

Однако, я должен считать выбор для многих больше choicefields. Поэтому, hardcoding все это не вариант.

Я думаю, что единственное решение здесь - использовать динамический SQL - с чем-то, с чем у меня нет опыта. Может ли кто-нибудь дать мне пример того, как я могу рассчитывать на любое поле выбора, количество вариантов их выбора?

Иные слова: только изменяя поле выбора [Name] в начале (Favorite Fruit, «Семейное положение», «Последний диплом» и т. Д.), Выбор должен быть просмотрен и подсчитан автоматически.

Возможно ли это? Любая помощь будет принята с благодарностью.

+3

Возможный дубликат [SQL Server динамический запрос PIVOT?] (Http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot -query) –

+2

EDIT: Я думаю, что Tab ведет вас в хорошем направлении. –

+0

Ничего себе, этот проект базы данных ... Таблицу типа CodeArtifact_1000210' не должно существовать. –

ответ

0

Вы можете непосредственно выполнить следующий код ..

Declare 
     @CodeName nVarChar(100), 
     @CodeType nVarChar(100), 
     @ColumnName nVarChar(MAX), 
     @DynamicSQL nVarChar(MAX); 


    Set @CodeName = 'Favorite Fruit'; 

    Select 
     @CodeType = Convert(varChar, [CodetypeID]) 
    From 
     [dbo].[CodeType] 
    Where 
     [Name] = @CodeName; 

    Create Table #tmpCode 
     (
      [ArtifactID] int, 
      [Name]   VarChar(100) 
     ) 

Set @DynamicSQL = 
    'Insert Into #tmpCode 
     Select 
      [ArtifactID], 
      [Name] 
     From 
      [dbo].[CodeType]    As ct 
       Inner Join [dbo].[Code] As cd 
        On ct.[CodetypeID] = cd.[CodetypeID]' + 
       'Inner Join [dbo].[CodeArtifact_' + @CodeType + '] As ca 
        On ca.[CodeArtifactID] = cd.[ArtifactID] 
     Where 
      ct.[Name] = @CodeName'; 

Exec(@DynamicSQL); 


    Select @ColumnName = 
     STUFF((
      Select 
       ',' + QUOTENAME([Name]) 
      From 
       #tmpCode 
      Group By 
       [Name] 
     For XML Path(''), Type).value('.', 'nVarChar(MAX)'), 1, 1, '') 


    Set @DynamicSQL = 
     'Select ' + @ColumnName + ' From 
      (Select [ArtifactID], [Name] From #tmpCode) tmp 
      Pivot (Count([ArtifactID]) For [Name] In (' + @ColumnName + ')) As pvt '; 

    Exec sp_executesql @DynamicSQL; 
    -- Exec (@DynamicSQL); 


    Drop Table 
     #tmpCode