SQL-запрос, чтобы получить число появлений целого числа в значениях столбцов (или советы, чтобы сделать это в коде) - PullRequest
0 голосов
/ 02 октября 2011

Название немного сбивает с толку, но я не нашел лучшего. вот что я хочу сделать. У меня есть таблица этой формы:


Имя | Пол | Ответы

Том | Мужчина | 1,2,3

Катя | Женский | 1,4

Джон | Мужчина | 2,4

Мэгги | Женский | 1,3


У меня есть 2 вопроса:

1) Если существует запрос для получения числа целых чисел, отображаемого в столбце Ответы?

В нашем примере:

Ответ | Count

1 | 3

2 | 2

3 | 2

4 | 2

2) Если вышесказанное возможно, есть ли способ разбить по полу:

В нашем примере:

Пол | Ответ | Количество

мужчина | 1 | 1

Мужской | 2 | 2

Мужской | 3 | 1

Женский | 1 | 2

Женский | 3 | 2

Надеюсь, я был чист.

Я использую C # и читаю данные из листа Excel с помощью OleDB Connection.

Если нет способа сделать это с помощью SQL-запроса, как это сделать в коде C #. (Я использую Datatable для заполнения данных, которые я читаю)

Большое спасибо за любую помощь

Ответы [ 3 ]

1 голос
/ 02 октября 2011

(я постараюсь ответить на это в MSSql)

Вы можете создать функцию разделения в sql, как показано в примере: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648

Обратите внимание, что вы можете изменить первый пример для этого (это код GroupOn, который будет вашим "мужским" или "женским" элементом):

CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(2000),
    @SplitOn nvarchar(5),
          @GroupOn nvarchar(100)
)  

RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Data nvarchar(100),
          GroupOn nvarchar(100)
) 
AS  
BEGIN 

Declare @Cnt int
Set @Cnt = 1

While (Charindex(@SplitOn,@RowData)>0)
Begin
    Insert Into @RtnValue (data)
    Select 
        Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

    Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
    Set @Cnt = @Cnt + 1
End

Insert Into @RtnValue (data, @GroupOn)
Select Data = ltrim(rtrim(@RowData))

Return
END

И тогда вы можете просто рассчитывать и группироваться соответственно.

EDIT Исправлено опечатка выше.

1 голос
/ 02 октября 2011

Вы не должны хранить несколько значений в поле, вы должны нормализовать таблицу, используя отдельную таблицу для ответов:

Person:
Id  Name   Gender
1   Tom    Male
2   Kate   Female
3   John   Male
4   Maggy  Female

Answer:
Id Answer
1  1
1  2
1  3
2  1
2  4
3  2
3  4
4  1
4  3

Теперь вы можете легко получить количество ответов, используя count

selecct p.Name, count(*) as Cnt
from Person p
inner join Answer a on a.Id = p.Id
group by p.Name

Вы также можете легко сгруппировать по полу и ответить:

selecct p.Gender, a.Answer, count(*)
from Person p
inner join Answer a on a.Id = p.Id
group by p.Gender, a.Answer
0 голосов
/ 02 октября 2011

Этот запрос для вопроса 2. Он может быть тривиально изменен, чтобы соответствовать результату из вопроса 1.

    declare @t table
    (
        name varchar(50),
        gender varchar(50),
        answers varchar(50)
    )

    insert into @t
    select 'Tom', 'Male', '1,2,3'
    union
    select 'Kate', 'Female', '1,4'
    union
    select 'John', 'Male', '2,4'
    union
    select 'Maggy', 'Female', '1,3'

    select 
        gender, answer, count = count(*)
    from
    (
        select
            gender, 
            -- here t2.c is an xml column, which holds values of this sort <a>1</a>
            -- 'data(.)' gets the value from the <a> tag
            answer = cast(t2.c.query('data(.)') as varchar)
        from
        (
            select 
                name, gender, 
                -- represent answers in the xml, proper for xquery node function
                -- for example <root><a>1</a><a>2</a></root>
                answers = cast('<root><a>' + replace(answers, ',', '</a><a>') + '</a></root>' as xml)
            from @t
        ) t1
        -- xquery nodes function reads the xml and
        -- in this case for each tag <a> it returns a separate row
        cross apply answers.nodes('/root/a') t2(c)
    ) t
    group by gender, answer
    order by gender desc, answer

Примечание: результат не будет соответствовать тому, который вы указали в части 2, потому что ваш результатне соответствует данным вашего примера, если я правильно понял вашу проблему.

...