选择数据库的重复结果中的SQL Server查询结果

时间:2014-01-28 01:24:45

标签: sql sql-server database duplicates normalizing

我有一个完整的数据库系统,主要与它自己的前端软件一起使用。今年我们的角色生成器只接受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。我看到了希望,但后来我回到了我开始的地方。

通常,我只是将数据逐行发送到字符生成器,​​但是自上次初选以来我们的图形系统已经发生了变化。

如果有人能让我知道要问的正确问题是什么,我会很感激。这当然是为了工作,这个数据源的全部重量都在我的肩膀上,我正在伸手可及的地方,我可以用一个断肢。

感谢您阅读本文。

2 个答案:

答案 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