我有一个完整的数据库系统,主要与它自己的前端软件一起使用。今年我们的角色生成器只接受XML数据源,我发现我可以查询数据库并创建XML文件。
数据库分布在十几个表中。我可以从2表查询中获取我想要的所有信息,但恐怕我需要3个。
我的前几个查询提出RACE
,每个种族有2个候选人,但是当我运行查询时,它会显示每个候选人的记录(第2次)。所以我有两行标题RACE NUMBER 101
。每一行都有两个候选人,他们的投票(由他们独特的候选人#相关,并在另一个表中),预先报告,投票百分比等等。
我想在一个ROW中进行一场比赛。一行,将显示比赛名称,候选人,他们的选票,投票百分比和区域报告。
我写的查询是:
SELECT *
FROM dbo.[RACE]
INNER JOIN dbo.[RACE CANDIDATES] ON [RACE].[race number] = [RACE CANDIDATES].[race number]
这为我提供了我能够查询的所有字段的完整概述,但它们显示了来自相同RACE#的2行。此外,它还显示了候选人的唯一#以及他们的投票数。但同样,这些都是2行。我在查询的行中看到的唯一两个差异是候选人的唯一ID和他们的投票号。
我想在一个单行中获得候选人的姓名,投票数和选民百分比,所以我可以在单个区块中将其作为XML PATH。一个种族,一个XML类别下的所有种族元素。
这让我疯了。提出这样的问题非常困难,特别是在这样的问题上。我将数据库保存为*.bak
文件,我现在可以在3台不同的机器上加载,所以如果有人想看一下,我就可以使用它。其中没有机密数据,所以提供它没有任何问题。
我有大约30个小时的SOLID。我看到了希望,但后来我回到了我开始的地方。
通常,我只是将数据逐行发送到字符生成器,但是自上次初选以来我们的图形系统已经发生了变化。
如果有人能让我知道要问的正确问题是什么,我会很感激。这当然是为了工作,这个数据源的全部重量都在我的肩膀上,我正在伸手可及的地方,我可以用一个断肢。
感谢您阅读本文。
答案 0 :(得分:1)
如果我理解正确,那么每个候选人在比赛中都会得到一排。您需要转动数据。
这是一种方式,首先使得票数最多的那个:
SELECT r.*, Winner, WinningVotes, Loser, LosingVotes
FROM dbo.[RACE] r inner join
(select rc.[race number],
max(case when seqnum = 1 then CandidateNumber end) as Winner,
max(case when seqnum = 1 then Votes end) as WinningVotes,
max(case when seqnum = 2 then CandidateNumber end) as Loser,
max(case when seqnum = 2 then Votes end) as LosingVotes
from (select rc.*,
row_number() over (partition by rc.[race number] order by votes desc) as seqnum
from dbo.[RACE CANDIDATES] rc
) rc
group by rc.[race number]
) rc
on r.[race number] = rc.[race number] ;
函数row_number()
是一个窗口函数。它会将值1分配给投票最多的候选人,将2分配给第二个候选人。
答案 1 :(得分:0)
如果行的所有字段都相同(除了id和投票数),您可以通过例如raceName(或您想要的其他字段)对它们进行分组。这样的东西,但如果你不提供架构,我无法帮助你:
SELECT r.raceName, rc.*
FROM race r
INNER JOIN race_candidates rc
ON race.race_number= race_candidates.race_number
GROUP BY r.raceName