0

最低スコアで受け入れられた回答を見つけるためのデータ エクスプローラー クエリを作成していますが、この部分は正常に動作します。

SELECT TOP 25 a.Id as [Post Link],
              a.Score as Score,
              (SELECT COUNT(*)
               FROM Votes
               WHERE PostId = a.Id AND
                     VoteTypeId = 2) AS [Upvotes],
              (SELECT COUNT(*)
               FROM Votes
               WHERE PostId = a.Id AND
                     VoteTypeId = 3) AS [Downvotes]
FROM Posts q INNER JOIN Posts a ON q.AcceptedAnswerId = a.Id
WHERE a.PostTypeId = 2
ORDER BY a.Score ASC

ただし、回答を投稿した人のスコアを計算しようとすると、パラメーターとして選択している列[Upvotes]と列を受け入れることができません。つまり、次のようになります。[Downvotes]

SELECT TOP 25 a.Id as [Post Link],
              a.Score as Score,
              (SELECT COUNT(*)
               FROM Votes
               WHERE PostId = a.Id AND
                     VoteTypeId = 2) AS [Upvotes],
              (SELECT COUNT(*)
               FROM Votes
               WHERE PostId = a.Id AND
                     VoteTypeId = 3) AS [Downvotes],
              (15 + (([Upvotes] * 10) - ([Downvotes] * 2))) AS [Answerer's Reputation]
FROM Posts q INNER JOIN Posts a ON q.AcceptedAnswerId = a.Id
WHERE a.PostTypeId = 2
ORDER BY a.Score ASC

私は言われ、有効な列名ではありません[Upvotes]:[Downvotes]

列名「賛成票」が無効です。列名「反対票」が無効です。

[Upvotes]宣言したばかりの値と同じであることを示すにはどうすればよいAS [Upvotes]ですか? それとも、これは単に不可能であり、ストアドプロシージャとして手動で行う必要がありますか?

4

2 に答える 2

1

問題は、計算された列が列を参照しているときに同時に計算されるため、SQL がそれらについて認識しないことです。

これが一つの解決策になります

SELECT A.[Post Link], 
   A.Score, 
   A.Upvotes, 
   A.Downvotes, 
   (15 + (([Upvotes] * 10) - ([Downvotes] * 2)))AS [Answerer's Reputation]
FROM(SELECT TOP 25 P.Id AS [Post Link], 
                 P.Score AS Score, 
                 (
   SELECT COUNT(*)
     FROM Votes
    WHERE Postid = P.Id
      AND Votetypeid = 2)AS [Upvotes], 
                 (
   SELECT COUNT(*)
     FROM Votes
    WHERE Postid = P.Id
      AND Votetypeid = 3)AS [Downvotes]
     FROM Posts Q
          INNER JOIN Posts P ON Q.Acceptedanswerid = P.Id
    WHERE P.Posttypeid = 2)A
 ORDER BY A.Score ASC;
于 2014-07-15T17:10:05.357 に答える
0

賛成票と反対票をテーブルとして扱わないのはなぜですか? あとは、好きなように働けます。

これは、テーブル値関数またはインライン テーブルの 2 つの方法で行うことができます。コードを選択すると、次のようになります。

SELECT TOP 25 a.Id as [Post Link],
          a.Score as Score,
          [Upvotes].CountVotes as Upvotes,
          [Downvotes].CountVotes as DOwnvotes,
          (15 + (([Upvotes].CountVotes * 10) - ([Downvotes].CountVotes * 2))) AS    [Answerer's Reputation]
  FROM Posts q INNER JOIN Posts a ON q.AcceptedAnswerId = a.Id, 
    (SELECT COUNT(*) as CountVotes
           FROM Votes
           WHERE PostId = a.Id AND
                 VoteTypeId = 2) AS [Upvotes],

          (SELECT COUNT(*) as CountVotes
           FROM Votes
           WHERE PostId = a.Id AND
                 VoteTypeId = 3) AS [Downvotes]
WHERE a.PostTypeId = 2
ORDER BY a.Score ASC
于 2014-07-15T17:25:21.713 に答える