【问题标题】:SQL Server Query Results in Duplicate Results for election DatabaseSQL Server 查询导致选举数据库的重复结果
【发布时间】:2014-01-28 14:23:39
【问题描述】:

我有一个完整的数据库系统,主要用于它自己的前端软件。今年我们的字符生成器只接受 XML 数据提要,我发现我可以查询数据库并创建一个 XML 文件。

数据库分布在大约十几个表中。我可以从 2 表查询中获得我想传达的所有信息,但恐怕我需要 3 个。

我的前几个查询提出了一个RACE,每场比赛有 2 名候选人,但是当我运行查询时,它会显示每个候选人的记录(乘以 2)。所以我有两行标题为RACE NUMBER 101。每行都有两个候选人,他们的选票(由他们的唯一候选人#相关,并且在另一个表中),选区报告,投票百分比..等等。

我想在一排中进行一场比赛。一行将显示比赛名称、两位候选人、他们的选票、他们的选票百分比和选区报告。

我写的查询是:

SELECT * 
FROM dbo.[RACE] 
INNER JOIN dbo.[RACE CANDIDATES] ON [RACE].[race number] = [RACE CANDIDATES].[race number] 

这为我提供了我能够查询的所有字段的完整概览,但它们显示了来自同一个 RACE# 的 2 行。此外,它还显示了候选人的唯一编号以及他们的票数。但同样,这些都在 2 行中。我可以在查询的行中看到的唯一 2 个区别是候选人的唯一 ID 和他们的投票号码。

我想在一个单行中同时获取候选人的姓名、票数和选民百分比,因此我可以在一个块中将其设为 XML PATH。一场比赛,一个 XML 类别下的所有比赛元素。

这让我发疯了。很难提出这样的问题,尤其是在这样的主题上。我已将数据库保存为*.bak 文件,我现在可以在 3 台不同的机器上加载该文件,因此如果有人想查看,我可以使用它。里面没有机密数据,所以我提供它没有问题。

我有大约 30 小时 SOLID 参与其中。我看到了希望,但后来我又回到了起点。

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

如果有人能告诉我什么是正确的问题,我将不胜感激。这当然是为了工作,这个数据馈送的全部重担都在我的肩上,我会在肢体骨折的情况下尽可能地伸出援手。

感谢您阅读本文。

【问题讨论】:

  • 请提供数据样本、您得到的结果以及期望的结果。
  • 根据示例查询的语法,我将其标记为 SQL Server。
  • 我尝试在下面添加部分架构。每场比赛我得到 2 行。我相信每一行都是针对每个候选人的。因为唯一的区别是候选人的唯一性# 和他们的选票。我想要一个包含所有比赛信息的单行,包括每个候选人的姓名和他们的总票数。我能够产生的唯一查询导致同一种族的两行......但投票总数和候选人人数不同。两行显示两个候选人两次。 (每行有2组候选人姓名。)快把我逼疯了!哈。
  • 哈!这一定是佛罗里达

标签: sql sql-server database duplicates normalizing


【解决方案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 分配给第二个候选人。

【讨论】:

  • 这很棒,但它仍然为一场比赛显示 2 场比赛。这肯定让我有更多的工作要做。谢谢!
  • @user3242661 。 . .我在子查询中留下了group by。固定。
  • 我试图离开小组,但我不确定我是否在关注你。查询未正确运行。感谢您的帮助和时间。
  • 是的!这已经把所有东西都排成一排了!现在我需要将所有字段缩小到我真正需要的范围内。
  • 你能解释一下r.*在做什么吗?以及如何直接与个别候选人确定获胜选票和落选票?再次感谢您对此进行调查。
【解决方案2】:

如果您的行的所有字段都相同(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

【讨论】:

  • 我可以通过电子邮件向您发送架构吗?论坛太大了。
  • 为了社区利益,您应该在此处发帖。此外,我们不需要所有架构,只需要与您的问题相关的表
  • /****** 对象:表 [dbo].[CANDIDATE] 脚本日期:01/27/2014 19:44:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[CANDIDATE]( [candidate number] [int] IDENTITY(5000,1) NOT NULL, [party] [nvarchar](20) NULL, [first name] [nvarchar](50) NULL,[姓氏] [nvarchar](50) NULL,[初始] [nvarchar](20) NULL,[人才] [nvarchar](200) NULL,[cother1] [nvarchar](50) NULL,[cother2] [nvarchar](50) NULL,[cother3] [nvarchar](50) NULL,[logo] [nvarchar](20) NULL,约束 [PK_CANDIDATE] 主键集群([候选编号] ASC)
  • /****** 对象:表 [dbo].[RACE CANDIDATES] 脚本日期:01/27/2014 19:44:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[RACE CANDIDATES]([race number] [int] NOT NULL, [candidate num] [int] NOT NULL, [votes] [int] NOT NULL, [winner] [bit] NOT NULL, [wire ID] [nvarchar](200) NULL, [incumbent] [bit] NOT NULL, [order] [bit] NOT NULL, [预计获胜者] [bit] NULL, CONSTRAINT [PK_RACE_CANDIDATES] PRIMARY KEY CLUSTERED ( [比赛号码] ASC,[候选人号码] ASC )
  • /****** 对象:表 [dbo].[RACE] 脚本日期:01/27/2014 19:44:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[RACE]( [race number] [int] NOT NULL, [sum results] [bit] NOT NULL, [fix percents] [bit] NOT NULL, [winners] [smallint] NULL , [maximum vote] [int] NOT NULL, [default cg] [nvarchar](50) NULL, [title1] [nvarchar](200) NULL, [title2] [nvarchar](200) NULL, [title3] [nvarchar ](200) NULL, [talent1] [nvarchar](200) NULL, [talent2] [nvarchar](200) NULL, [talent3] [nvarchar](200) NULL, [wire id1] [nvarchar](200) NULL ,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多