我是一名IT分析师,试图学习一些SQL,以帮助我以更有效的方式与开发人员合作。 给了自己一个小的个人项目来帮助我学习SQL,并遇到了一些问题,我希望你们都能帮助我。
背景
我对飞镖很感兴趣,所以我想创建一个数据库来记录我的每个回合。 如果您不熟悉飞镖,每个回合都包括三次投掷飞镖板。
我正在设计一个带有两个表的数据库:
- "回合
"跟踪每个玩家的回合。
- TurnID 是主键,是一个自动递增的整数。
- Throw1 包含玩家第一次投掷的结果。
- Throw2 包含玩家第二次投掷的结果。
- Throw3 包含玩家第三次投掷的结果。
"分数值"是一个参考表,其中列出了分数和分数的价值。 每条记录将一个"分数"与一个"值"相关联。 "分数"是主键。
- 分数是主键,代表投掷的一种可能结果。
- 值包含玩家投掷的值。 所以一个"S20"值 20 分。
表摘录/示例
转弯
TurnID Throw1 Throw2 Throw3
101 S20 S16 S18
102 S16 S19 S17
分数值
Score Value
S20 20
S19 19
S18 18
S17 17
S16 16
S15 15
查询
这就是挑战的开始。 我正在寻找一个查询,它将生成如下所示的输出:
TurnID Throw1 Throw2 Throw3 Throw1Value Throw2Value Throw3Value
101 S20 S16 S18 20 16 18
102 S16 S19 S17 16 19 17
如果我运行以下查询,我可以得到我正在寻找的内容,但仅适用于 Throw1:
SELECT Turns.TurnID, Turns.Throw1, Turns.Throw2, Turns.Throw3, ScoreValues.Value
FROM Turns
INNER JOIN Values on Turns.Throw1 = ScoreValues.Score
您对如何获得预期的输出有什么建议吗? 如果有任何不清楚的地方,请告诉我。
谢谢!
K
这是我认为你正在寻找的。我已经习惯了 Oracle,但希望它也适用于其他口味:
SELECT T.TurnID,
T.Throw1,
T.Throw2,
T.Throw3,
(SELECT value from ScoreValues where score = t.Throw1) as Throw1Value,
(SELECT value from ScoreValues where score = t.Throw2) as Throw2Value,
(SELECT value from ScoreValues where score = t.Throw3) as Throw3Value,
FROM Turns t
您的第一个问题是您将结果集限制为 Throw1。 任何过滤/限制,您可能希望在 where 子句中使用 TurnId。 在您的示例中,不需要 where 子句。对于这么简单的事情,您可以使用以下内容:
SELECT TurnId, Throw1, Throw2, Throw3, ThrowValue1 =
(select value from ScoreValues where Score = Throw1),
ThrowValue2 = (select value from ScoreValues where Score = Throw2),
ThrowValue3 = (select value from ScoreValues where Score = Throw3)
FROM Turns
以下是解释数据透视表的几个网站,数据透视表是按列表示行值的概念。 随着查询复杂性的增加,您需要使用以下内容:http://blog.sqlauthority.com/2008/05/22/sql-server-pivot-table-example/http://msdn.microsoft.com/en-us/library/ms177410(SQL.105).aspx