我希望能够根据另一列中的值选择一列。用一个简单的例子: 来自
Name Status Activities
A Full Tennis
B Discounted Badminton
C Full Badminton
还有
Sport Full Discounted
Tennis 70 60
Badminton 110 90
我想输出:
Name Due
A 70
B 90
C 110
要连接前两个表,只需突出显示需要从另一个值中选择一个列即可。 我选择存储数据可能是错误的。有什么想法吗?
答案 0 :(得分:1)
您可以选择数据存储,尽管最好在每个表中都包含id
值,然后将人事表链接到会费id
值而不是名称的会费表上。给定您的结构,您可以通过简单的JOIN
获得所需的结果:
SELECT p.Name
, CASE WHEN p.Status = 'Full' THEN d.Full ELSE d.Discounted END AS Due
FROM people p
JOIN dues d ON d.Sport = p.Activities
输出:
Name Due
A 70
B 90
C 110
答案 1 :(得分:0)
问题在于您的数据未规范化,这使查询变得更加困难。一种方法是规范化数据。一种方法是在派生表中。另一个方法是构造表以便对其进行规范化。
由于状态和运动的组合产生了比率,因此数据没有被标准化,因为您有两个比率列。
SELECT Name, Due
FROM A
INNER JOIN (SELECT Sport, 'Full' as Status, Full as Due FROM B UNION ALL
SELECT Sport, 'Discounted' as Status, Discounted as Due FROM B) B
on A.Activities = B.Sport
and A.Status = B.Status
而不是像这样的表:
Sport Full Discounted
Tennis 70 60
Badminton 110 90
这是标准化的,因为您可以添加运动/费率类型和不更改结构的新费率。如果您需要以以前的格式添加新的费率类型,则可以添加表格。
Sport RateType Rate
Tennis Full 70
Tennis Discounted 60
Badminton Full 110
Badminton Discounted 90
通过这种方式,您可以添加体育运动和不同的价格,而无需更改代码。
Tennis Weekend 20
Complete Family 575
从技术上讲,您应该有一个RateType表,该表将列出费率名称和ID,以便您可以完整列出所有可用的rateType,然后可以根据需要将其绑定到每个运动和$ rate。您还可以显示费率类型何时被折旧,因此不能选择新的费率类型,而可以保留现有的费率类型。