Commish13 Ответов: 2

Оператор Sql CASE не работает


Я связываюсь, чтобы сделать спортивный выбор НФЛ весь бассейн. Пользователи выбирают победителя из каждой игры. Я пытаюсь написать хранимую процедуру, которая будет показывать результаты выбора пользователей и если там выбор правильный или неправильный. Я использую CASE но это, очевидно, не работает. Когда я показываю эту процедуру на своем сайте, только первые результаты игры являются правильными.

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

Моя таблица UserPicks собирает все выборы от пользователя. Мой WonLost таблица содержит название команды, выигравшей игру(GameResults_1 и т. д.).

Заранее спасибо за любую помощь.

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

SELECT UserPicks.FullName, UserPicks.Game_1, UserPicks.Game_2, UserPicks.Game_3, UserPicks.Game_4, UserPicks.Game_5,
	   WonLost.GameResults_1, WonLost.GameResults_2, WonLost.GameResults_3, WonLost.GameResults_4, WonLost.GameResults_5,
(
CASE 
WHEN UserPicks.Game_1 = WonLost.GameResults_1
	THEN  'Won' 

WHEN UserPicks.Game_2 = WonLost.GameResults_2
	THEN 'Won' 

WHEN UserPicks.Game_3 = WonLost.GameResults_3
	THEN 'Won' 

WHEN UserPicks.Game_4 = WonLost.GameResults_4
	THEN 'Won' 

WHEN UserPicks.Game_5 = WonLost.GameResults_5
	THEN 'Won' 

	ELSE 'Lost'
	
END 
) AS Results
FROM UserPicks

JOIN WonLost ON UserPicks.Week = WonLost.Week

WHERE WonLost.Week = 'Week1'

Santosh kumar Pithani

Ваше утверждение о случае не ясно, я имею в виду, что более одного условия случая истинно.Вам нужно написать например:"корпус
КОГДА (
(UserPicks.Game_1 = WonLost.GameResults_1) или
(UserPicks.Game_2 = WonLost.GameResults_2)
)
ТОГДА "ВЫИГРАЛ" ИЛИ "ПРОИГРАЛ" КОНЕЦ"

Commish13

Это утверждение приводит к тем же результатам. Когда первая игра верна, она также показывает, что остальные игры верны, даже если некоторые другие игры неверны. То же самое если первая игра неверна то она отображает остальные игры неверно

2 Ответов

Рейтинг:
14

Wendelius

Мне кажется, что в этом дизайне есть какой-то изъян. На данный момент вы храните пользовательские выборы и еженедельные результаты в одной таблице, содержащей по 5 столбцов в каждой строке. Что происходит, например, если
- Есть 6 матчей в неделю
- Пользователь выбирает больше/меньше
- Номера совпадений не коррелируют, например пользователь pick 3 На самом деле является wonlost 2
- И так далее.

На мой взгляд, вы должны хранить как кирки, так и спички в виде строк. Рассмотрим следующий пример:

User -table
----------
userid
name
...

Game -table
----------
GameId
Week

UserPick -table
------------
Userid
GameId

GameResult -table
-------------
GameId
WinnerTeamId
и так далее...

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

Для получения дополнительной информации взгляните на Третья нормальная форма - Википедия[^]


Maciej Los

5ed!

Commish13

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

Wendelius

Простите, но мне трудно понять ваше описание. Может быть, какие-то примеры данных?

Рейтинг:
1

Maciej Los

В дополнение к решению №1 по Венделиус[^], я бы изменил дизайн вашей базы данных следующим образом (таблицы):
1. пользователь (хранит информацию о пользователях)
2. Игра (хранит информацию об играх, таких как: покер, Бридж и т. д.)
3. тур (хранит информацию об играх, начатых в определенное время /такой сессии/)
4. Tour_Details (хранит информацию о пользователях, играющих в игру, и их результатах)

--Note: declaration of tables is incomplete, due to training purposes...

DECLARE @user TABLE(UserId INT IDENTITY(1,1), UserName VARCHAR(50))
INSERT INTO @user(UserName)
VALUES('John'), ('Gina'), ('Frank'), ('Dolores'), ('Sebastian'), ('Angel'), ('Robert'), ('Eve')

DECLARE @game TABLE(GameId INT IDENTITY(1,1), GameName VARCHAR(50))
INSERT INTO @game(GameName)
VALUES('Poker'), ('Bridge')

DECLARE @tour TABLE(TourId INT IDENTITY(1,1), StartedAt DATETIME, GameId INT)
INSERT INTO @tour(StartedAt, GameId )
VALUES('2018-04-25 18:05:37.000', 1), ('2018-04-25 21:15:12.000', 2)

DECLARE @tour_details TABLE(TourDetailId INT IDENTITY(1,1), TourId INT, UserId INT, ReachedPoints INT)
INSERT INTO @tour_details(TourId, UserId, ReachedPoints)
VALUES(1, 1, 0), (1, 2, 2500), (1, 3, 750), (1, 4, 500),
(2, 7, 2500), (2, 8, -500), (2, 5, 2500), (2, 6, -500)  


SELECT TR.TourId, G.GameName, T.StartedAt, U.UserName, TR.ReachedPoints
FROM @tour_details AS TR 
	INNER JOIN @user AS U ON TR.UserId = U.UserId 
	INNER JOIN @tour AS T ON TR.TourId = T.TourId 
	INNER JOIN @game AS G ON G.GameId = T.GameId 
ORDER BY TR.TourId ASC, TR.ReachedPoints DESC


Пример вывода:
TourId	GameName	StartedAt	UserName	ReachedPoints
1	Poker	2018-04-25 18:05:37.000	Gina	2500
1	Poker	2018-04-25 18:05:37.000	Frank	750
1	Poker	2018-04-25 18:05:37.000	Dolores	500
1	Poker	2018-04-25 18:05:37.000	John	0
2	Bridge	2018-04-25 21:15:12.000	Sebastian	2500
2	Bridge	2018-04-25 21:15:12.000	Robert	2500
2	Bridge	2018-04-25 21:15:12.000	Eve	-500
2	Bridge	2018-04-25 21:15:12.000	Angel	-500


Как вы можете видеть, всякий раз, когда пользователи начинают играть в новую игру, открывается новый тур, а затем TourID в каждом UserID хранится в Tour_Details стол. Такой дизайн позволяет хранить подробную информацию об однопользовательских и многопользовательских играх.

Удачи вам!