0

私は、主に独自のフロントエンド ソフトウェアで使用される完全なデータベース システムを持っています。今年、私たちの文字ジェネレーターは XML データ フィードのみを受け入れ、データベースにクエリを実行して XML ファイルを作成できることがわかりました。

データベースは、約 12 個のテーブルに分散しています。放送したいすべての情報を 2 つのテーブル クエリから取得できますが、3 つ必要になるのではないかと心配しています。

最初のいくつかのクエリでは が表示されRACE、各レースには 2 つの候補がありますが、クエリを実行すると、各候補のレコードが表示されます (2 倍)。だから私はタイトルが2行ありますRACE NUMBER 101。各行には、両方の候補者、その投票 (一意の候補者番号によって関連付けられ、別のテーブルにあります)、選挙区の報告、投票率などがあります。

1 つの ROW 内で 1 つのレースを取得しようとしています。1 つの行には、レースのタイトル、両方の候補者、投票、投票率、選挙区の報告が表示されます。

私が書いたクエリは次のとおりです。

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

これにより、クエリできるすべてのフィールドの完全な概要が得られますが、同じ RACE# から 2 行が表示されています。また、候補者の一意の # と投票数も表示されます。繰り返しますが、これらはすべて 2 つの行にあります。クエリされた行で確認できる唯一の 2 つの違いは、候補者の一意の ID と投票番号です。

候補者の名前、投票数、有権者の割合の両方を 1 つの行で取得したいので、1 つのブロックで XML PATH にすることができます。1 つのレース、すべてのレース要素は 1 つの XML カテゴリに属します。

それは私を夢中にさせています。このような質問をするのは非常に難しいです。特に、このような主題についてはそうです。私はデータベースを*.bakファイルとして保存しており、これを 3 台の異なるマシンにロードできるようになりました。その中に機密データはありませんので、提供しても問題ありません。

私はこれに約30時間SOLIDしています。希望は見えますが、最初の場所に戻ってしまいます。

通常は、データを 1 行ずつ文字ジェネレーターにシリアルで送信するだけですが、前回の予備選挙以降、グラフィック システムが変更されました。

どのような質問をするのが正しいのか、誰か教えていただければ幸いです。これはもちろん仕事のためであり、このデータ フィードの全重量は私の肩にかかっています。

これを読んでくれてありがとう。

4

2 に答える 2

1

私の理解が正しければ、あなたはレースの候補者ごとに 1 行を取得しています。データをピボットする必要があります。

これは、最も多くの票を獲得したものを最初に配置する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 の値を割り当てます。

于 2014-01-28T01:41:42.823 に答える
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
于 2014-01-28T01:39:39.443 に答える