Commish13 Ответов: 1

Я пытаюсь подсчитать или получить сумму значений, которые соответствуют другим значениям в другой таблице


Я пытаюсь сделать футбольный пул, где пользователь выбирает победителя каждой игры. Затем я хотел бы, чтобы отобразить пользователей выбирает и слово выиграна или проиграна рядом с пользователей берет. Я также хотел бы отобразить количество побед каждого пользователя.

У меня есть первая часть работы, но я пытаюсь подсчитать выигрыши в каждом ряду.

У меня есть 2 стола.

1-я таблица: UserPicks
Columns: FullName, Week, Game_1, Game_2, Game_3, Game_4, Game_5

2 - я таблица: WeeklyResults-только название команд, которые выиграли
Columns: Week, GameResults_1, GameResults_2, GameResults_3, GameResults_4, GameResults_5

Спасибо за любую вашу помощь...

Что я уже пробовал:

Это показывает выигрыш или проигрыш. Это хорошо работает

SELECT UserPicks.FullName, UserPicks.Game_1, UserPicks.Game_2, UserPicks.Game_3, UserPicks.Game_4, UserPicks.Game_5,
       (CASE WHEN UserPicks.Game_1 = WeeklyResults.GameResults_1 THEN 'Win' ELSE 'Lost' END) AS GameResult_1,
       (CASE WHEN UserPicks.Game_2 = WeeklyResults.GameResults_2 THEN 'Win' ELSE 'Lost' END) AS GameResult_2,
       (CASE WHEN UserPicks.Game_3 = WeeklyResults.GameResults_3 THEN 'Win' ELSE 'Lost' END) AS GameResult_3,
       (CASE WHEN UserPicks.Game_4 = WeeklyResults.GameResults_4 THEN 'Win' ELSE 'Lost' END) AS GameResult_4,
	   (CASE WHEN UserPicks.Game_5 = WeeklyResults.GameResults_5 THEN 'Win' ELSE 'Lost' END) AS GameResult_5
 FROM UserPicks
 JOIN WeeklyResults ON UserPicks.Week = WeeklyResults.Week
WHERE WeeklyResults.Week = 'Week1'

Это мой код, чтобы попытаться подсчитать выигрыши:<br> Но он работает неправильно
SELECT  FullName, SUM(CASE WHEN UserPicks.Game_1 = WeeklyResults.GameResults_1 THEN 1
			               WHEN UserPicks.Game_2 = WeeklyResults.GameResults_2 THEN 1
			               WHEN UserPicks.Game_3 = WeeklyResults.GameResults_3 THEN 1
				           WHEN UserPicks.Game_4 = WeeklyResults.GameResults_4 THEN 1
				           WHEN UserPicks.Game_5 = WeeklyResults.GameResults_5 THEN 1 END) AS [Count of Wins]
  FROM UserPicks
  JOIN WeeklyResults ON UserPicks.Week = WeeklyResults.Week 
  GROUP BY FullName

Wendelius

Пожалуйста, объясните более подробно, как это работает неправильно. Каков был результат и каков был ожидаемый результат

Rajat-Indiandotnet

Не могли бы вы добавить те же таблицы данных?

1 Ответов

Рейтинг:
12

Maciej Los

Ну что ж, вот вам и ответ: Оператор Sql CASE не работает[^], но вы даже не узнаете, как оптимизировать свою базу данных... грустно...

У вас есть 2 варианта:
1. подведите итоги каждой игры (простой)
2. распакуйте данные и суммируйте каждый (более сложный)


Что касается 1.

SELECT FullName, Game_1, Game_2, Game_3, Game_4, Game_5, GameResult_1 + GameResult_2 + GameResult_3 + GameResult_4 + GameResult_5 AS TotalPoints
FROM (
    SELECT UserPicks.FullName, UserPicks.Game_1, UserPicks.Game_2, UserPicks.Game_3, UserPicks.Game_4, UserPicks.Game_5,
       (CASE WHEN UserPicks.Game_1 = WeeklyResults.GameResults_1 THEN 1 ELSE 0 END) AS GameResult_1,
       (CASE WHEN UserPicks.Game_2 = WeeklyResults.GameResults_2 THEN 1 ELSE 0 END) AS GameResult_2,
       (CASE WHEN UserPicks.Game_3 = WeeklyResults.GameResults_3 THEN 1 ELSE 0 END) AS GameResult_3,
       (CASE WHEN UserPicks.Game_4 = WeeklyResults.GameResults_4 THEN 1 ELSE 0 END) AS GameResult_4,
	   (CASE WHEN UserPicks.Game_5 = WeeklyResults.GameResults_5 THEN 1 ELSE 0 END) AS GameResult_5
 FROM UserPicks
 JOIN WeeklyResults ON UserPicks.Week = WeeklyResults.Week
WHERE WeeklyResults.Week = 'Week1' ) AS CommonData



Что касается 2.
Предположим, что ваш запрос возвращает что-то вроде этого:
FullName	Game1	Game2	Game3	Game4	Game5	GameResult1	GameResult2	GameResult3	GameResult4	GameResult5
User1	Game1	Game2	Game3	Game4	Game5	1	1	0	1	0
User1	Game1	Game2	Game3	Game4	Game5	1	0	1	1	0
User1	Game1	Game2	Game3	Game4	Game5	0	1	1	1	1
User1	Game1	Game2	Game3	Game4	Game5	1	1	0	0	0
User1	Game1	Game2	Game3	Game4	Game5	0	1	0	1	0


использовать:
-- Create the table and insert sample data.  
DECLARE @commondata TABLE (FullName VARCHAR(30), Game1 VARCHAR(30), Game2 VARCHAR(30), Game3 VARCHAR(30), Game4 VARCHAR(30), Game5 VARCHAR(30),
    GameResult1 INT, GameResult2 INT, GameResult3 INT, GameResult4 INT, GameResult5 INT)
	 
INSERT INTO @commondata (FullName, Game1, Game2 , Game3, Game4, Game5,
    GameResult1, GameResult2, GameResult3, GameResult4, GameResult5)
VALUES ('User1', 'Game1', 'Game2', 'Game3', 'Game4', 'Game5', 1,1,0,1,0),
('User1', 'Game1', 'Game2', 'Game3', 'Game4', 'Game5', 1,0,1,1,0),
('User1', 'Game1', 'Game2', 'Game3', 'Game4', 'Game5', 0,1,1,1,1),
('User1', 'Game1', 'Game2', 'Game3', 'Game4', 'Game5', 1,1,0,0,0),
('User1', 'Game1', 'Game2', 'Game3', 'Game4', 'Game5', 0,1,0,1,0)


-- Unpivot the table.  
SELECT FullName, Game, SUM(Points) As Total 
FROM   
   (SELECT * 
   FROM @commondata) pvt  
UNPIVOT  
   (Points FOR Game IN   
      (GameResult1, GameResult2, GameResult3, GameResult4, GameResult5)  
)AS unpvt
GROUP BY FullName, Game

Результат:
FullName	Game	Total
User1	GameResult1	3
User1	GameResult2	4
User1	GameResult3	2
User1	GameResult4	4
User1	GameResult5	1


В случае, если вы хотите только FullName и общее количество очков, удалить Game колонка из SELECT список и GROUP BY заявление.


Commish13

Спасибо, с вашим кодом я смог получить нужные результаты. У меня возникли проблемы с отображением общей суммы или баллов на моем сайте. Сейчас я играю с ним, но если у вас есть какие-то предложения, я буду признателен.

Спасибо за вашу помощь с приведенным выше кодом