SQL如何根据列值选择列

时间:2018-12-04 21:49:19

标签: mysql join

我希望能够根据另一列中的值选择一列。用一个简单的例子: 来自

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

要连接前两个表,只需突出显示需要从另一个值中选择一个列即可。 我选择存储数据可能是错误的。有什么想法吗?

2 个答案:

答案 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

Demo on SQLFiddle

答案 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。您还可以显示费率类型何时被折旧,因此不能选择新的费率类型,而可以保留现有的费率类型。