首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询,以获取列值中整数的外观数(或在代码中获取整数外观的提示)

SQL查询,以获取列值中整数的外观数(或在代码中获取整数外观的提示)
EN

Stack Overflow用户
提问于 2011-10-02 02:01:23
回答 3查看 367关注 0票数 0

标题有点混乱,但我找不到更好的。这是我想做的。我有一张表格:

姓名-性别-答案

Tom =男性. 1,2,3

Kate女性1,4

John x男性2,4

Maggy女士1,3

我有两个问题:

1)如果有一个查询来获取出现在“答案”列中的整数数?

在我们的例子中:

答案计数

1/3

2-2-2

3/2

4/2

2)如果有可能,是否有办法按性别分列:

在我们的例子中:

性别-答案-统计

男-1-1

男-2-2

男-3-1

女性.1.2

女-3-2

我希望我说的很清楚。

我使用C#,并使用OleDB连接从excel工作表中读取数据。

如果无法通过SQL查询执行此操作,则如何使用C#代码进行操作。(我使用Datatable来填充所读取的数据)

非常感谢您的帮助

EN

回答 3

Stack Overflow用户

发布于 2011-10-02 02:17:23

不应将多个值存储在字段中,应使用单独的表对表进行规范化处理:

代码语言:javascript
复制
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轻松地获得答案的数量。

代码语言:javascript
复制
selecct p.Name, count(*) as Cnt
from Person p
inner join Answer a on a.Id = p.Id
group by p.Name

你也可以很容易地按性别分组,并回答:

代码语言:javascript
复制
selecct p.Gender, a.Answer, count(*)
from Person p
inner join Answer a on a.Id = p.Id
group by p.Gender, a.Answer
票数 1
EN

Stack Overflow用户

发布于 2011-10-02 02:19:36

(我将尝试在MSSql中回答这个问题)

您可以使用sql创建一个拆分函数,如下面所示的示例:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648

注意,您可以修改第一个示例(这是GroupOn代码,它将是您的“男性”或“女性”元素):

代码语言:javascript
复制
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

然后你就可以相应地数数和分组。

编辑修复了上面的拼写错误。

票数 1
EN

Stack Overflow用户

发布于 2011-10-02 13:15:01

这个查询是针对问题2的,可以对其进行小修改,以匹配问题1的结果。

代码语言:javascript
复制
    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部分中提供的结果不匹配,因为您的结果与示例数据不相对应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7624173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档