我需要从 xml 字段中获取一些数据。 特殊问题是 xml 字段本身。
xml 字段就是这样构建的:
<UseAnsw>
<User User="3" Answ="N" />
<User User="2" Answ="N" />
<User User="7" Answ="N" />
<User User="5" Answ="N" />
<User User="1" Answ="N" />
</UseAnsw>
Sql 表还有一个包含发布问题的用户的列。 我需要做的是,计算用户回答问题的频率。
举个例子:
use_ID use_PostingUser use_UseAnsw
00001 2 <UseAnsw>
<User User="3" Answ="N" />
<User User="1" Answ="N" />
<User User="7" Answ="N" />
</UseAnsw>
00002 4 <UseAnsw>
<User User="2" Answ="N" />
<User User="1" Answ="N" />
<User User="3" Answ="N" />
</UseAnsw>
00003 1 <UseAnsw>
<User User="3" Answ="N" />
<User User="5" Answ="N" />
<User User="8" Answ="N" />
</UseAnsw>
我寻找的那个例子的结果是:
User AnswersGiven
1 2
2 1
4 0
我希望有人能理解我的尝试并能够帮助我(一个 sql 初学者,尤其是在涉及 xml 时)
最佳答案
我不明白,你的计数是如何工作的,但这可能会把你推向正确的道路:
DECLARE @tbl TABLE(use_ID VARCHAR(100),use_PostingUser INT,use_UseAnsw XML);
INSERT INTO @tbl VALUES
('00001',2,'<UseAnsw>
<User User="3" Answ="N" />
<User User="1" Answ="N" />
<User User="7" Answ="N" />
</UseAnsw>')
,('00002',4,'<UseAnsw>
<User User="2" Answ="N" />
<User User="1" Answ="N" />
<User User="3" Answ="N" />
</UseAnsw>')
,('00003',1,'<UseAnsw>
<User User="3" Answ="N" />
<User User="5" Answ="N" />
<User User="8" Answ="N" />
</UseAnsw>');
此查询将返回所有数据
SELECT use_ID,use_postingUser
,Usr.value('@User','int') AS AttribUser
,Usr.value('@Answ','varchar(max)') AS AttribAnsw
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
这里我使用相同的方法返回列 use_postingUser及其计数 User元素(实际上是同名属性)
SELECT use_postingUser
,COUNT(Usr.value('@User','int')) AS CountAttribUser
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
GROUP BY use_PostingUser
希望这有助于...
我还是不明白你的逻辑,但这可能更接近:
CTE “AllData”提供所有数据的列表(和以前一样)
在决赛中SELECT根据 XML 中 的用户编号计算每个用户的答案数。这对于 1,2 和 4(零 == 不存在)是可以的,但是还有更多您没有在预期输出中提及的 ID...
如果您需要播放所有 ID(带零的 4),您将需要所有用户的列表和一个 LEFT JOIN到 XML 的数据...
WITH AllData AS
(
SELECT use_ID,use_postingUser
,Usr.value('@User','int') AS AttribUser
,Usr.value('@Answ','varchar(max)') AS AttribAnsw
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
)
SELECT AttribUser
,COUNT(*) AS CountAttribUser
FROM AllData
GROUP BY AttribUser
根据 Y.B 的评论,它可能是这样的:(使用上面声明的表变量)
WITH AllData AS
(
SELECT use_ID,use_postingUser
,Usr.value('@User','int') AS AttribUser
,Usr.value('@Answ','varchar(max)') AS AttribAnsw
FROM @tbl AS tbl
CROSS APPLY use_UseAnsw.nodes('/UseAnsw/User') AS One(Usr)
)
SELECT DistinctUsers.use_PostingUser
,COUNT(AllData.AttribUser) AS CountAttribUser
FROM @tbl AS DistinctUsers
LEFT JOIN AllData ON DistinctUsers.use_PostingUser=AllData.AttribUser
GROUP BY DistinctUsers.use_PostingUser
关于sql - 在 SQL Server 2008 中检查 xml 字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38181104/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)