3

そのため.... コンテストに関連する 3 つの異なるテーブルがあり、DB は各コンテストで獲得したポイント数を追跡​​します。コンテスト 1、2、および 3。ユーザーが何かを達成するたびに、そのユーザーの新しい行が追加ポイントとともに作成されます。したがって、ユーザーが受け取ったすべてのポイントを計算するために、select sum を使用します

SELECT userID, SUM(amount1) as "Contest 1 Points"
FROM [Company].[dbo].[Contest1]
WHERE userid not in (0,1)
GROUP BY userId
ORDER BY userid

あと 2 つのコンテストがあるので、それぞれについてもクエリを実行します...

SELECT userId, SUM(amount2)/.65 AS "Category 2 Points"
FROM [Company].[dbo].[Contest2]
WHERE dateGiven >=201301 AND dateGiven <= 201305
GROUP BY userId
ORDER BY userid



SELECT userid, SUM(amount3) AS "Category 3 Points"
FROM [Company].[dbo].[Contest3]
where userid not in (1,2)
GROUP BY userid
ORDER BY userid

基本的に、各ユーザーが各コンテストから受け取るすべてのポイントを、基本的に結果を示す 1 つの列に合計する必要があります USERID, TOTAL OF TOTALS(Contest1 + Contest2 + Contest3)

または、少なくとも次のようにします。

ユーザー、コンテスト1合計、コンテスト2合計、コンテスト3合計

これまでに行った方法は、これらの結果をそれぞれ Excel にコピー アンド ペーストしてから、VLOOKUP を使用してそれらを相互に照合することでした。私はSQLにかなり慣れていないので、ユーザーIDを一致させるために参加してONを使用しようとしましたが、構文に問題があり、クエリのためにすべてがプラグインされていることを理解しています。

4

1 に答える 1

3

結果をUNIONする必要があります:

SELECT userID, SUM(Points) AS total
FROM
 ( 
   SELECT userID, SUM(amount1) AS "Points"
   FROM [Company].[dbo].[Contest1]
   WHERE userid NOT IN (0,1)
   GROUP BY userId

   UNION ALL       

   SELECT userId, SUM(amount2)/.65 AS "Category 2 Points"
   FROM [Company].[dbo].[Contest2]
   WHERE dateGiven >=201301 AND dateGiven <= 201305
   GROUP BY userId

   UNION ALL       

   SELECT userid, SUM(amount3) AS "Category 3 Points"
   FROM [Company].[dbo].[Contest3]
   WHERE userid NOT IN (1,2)
   GROUP BY userid
 ) AS dt
GROUP BY userID
ORDER BY 2 DESC;

編集: 3 つの個別の列を取得するには、1 つではなく 3 つの SUM を使用するだけです。

SELECT userID, SUM("Category 1 Points"), SUM("Category 2 Points"), SUM("Category 3 Points") 
FROM
 ( 
   SELECT userID, SUM(amount1) AS "Category 1 Points"
   FROM [Company].[dbo].[Contest1]
   WHERE userid NOT IN (0,1)
   GROUP BY userId

   UNION ALL       

   SELECT userId, SUM(amount2)/.65 AS "Category 2 Points"
   FROM [Company].[dbo].[Contest2]
   WHERE dateGiven >=201301 AND dateGiven <= 201305
   GROUP BY userId

   UNION ALL       

   SELECT userid, SUM(amount3) AS "Category 3 Points"
   FROM [Company].[dbo].[Contest3]
   WHERE userid NOT IN (1,2)
   GROUP BY userid
 ) AS dt
GROUP BY userID
ORDER BY 2 DESC;

もちろん、userDI/category ごとに 1 つの行しかないため、MIN または MAX は同じ結果を返します。これは、存在しないデータに対して NULL を返します。代わりに 0 が必要な場合は、COALESCE("Category x Points", 0) を使用します。

結果セットに参加することもできますが、各ユーザーが各コンテストに参加したことが保証されていない限り、COALESCE を使用して FULL OUTER JOIN が必要です。

SELECT userID, "Category 1 Points", "Category 2 Points", "Category 3 Points"
FROM
 ( 
   SELECT userID, SUM(amount1) AS "Category 1 Points"
   FROM [Company].[dbo].[Contest1]
   WHERE userid NOT IN (0,1)
   GROUP BY userId
 ) AS t1
FULL JOIN
ON t1.userID = t2.userID
 (
   SELECT userId, SUM(amount2)/.65 AS "Category 2 Points"
   FROM [Company].[dbo].[Contest2]
   WHERE dateGiven >=201301 AND dateGiven <= 201305
   GROUP BY userId
 ) AS t2
FULL JOIN
 (
   SELECT userid, SUM(amount3) AS "Category 3 Points"
   FROM [Company].[dbo].[Contest3]
   WHERE userid NOT IN (1,2)
   GROUP BY userid
 ) AS t3
ON COALESCE(t1.userID, t2.userID) = t3.userID
ORDER BY 2 DESC;
于 2013-09-17T21:54:21.200 に答える