在 SQL 中的其他列中查找具有最高值的列
Finding columns with highest value among other columns in SQL
我有一个 table 看起来像这样:
table,
th,
td {
border: 1px solid black;
<table>
<tr>
<th>Customer</th>
<th>Category 1</th>
<th>Category 2</th>
<th>Category 3</th>
<th>Category 4</th>
</tr>
<tr>
<td>aaaaa@aaa.com</td>
<td>0</td>
<td>563</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>bbbb@bbb.com</td>
<td>33</td>
<td>31</td>
<td>38</td>
<td>13</td>
</tr>
<tr>
<td>cccc@ccc.com</td>
<td>108</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>dddd@ddd.com</td>
<td>0</td>
<td>7</td>
<td>0</td>
<td>11</td>
</tr>
</table>
我正在尝试插入一个名为 "BestCategory" 的新列,它将显示它们之间具有最高值的类别的名称。
我尝试使用 GREATEST,但我的系统不接受它。
你们能帮帮我吗?
首先你必须使用UNPIVOT
来计算每一行的maxValue
然后用一个CASE
来select什么BestCategory
.
WITH maxValues as
(
select
[Customer], Max(Amount) as TheMax
from
Customer
UNPIVOT (Amount for AmountCol in
([Category 1], [Category 2], [Category 3], [Category 4])) as unpvt
group by [Customer]
)
select
Customer.[Customer], [Category 1], [Category 2], [Category 3], [Category 4],
TheMax,
Case
WHEN [Category 1] = TheMax THEN '[Category 1]'
WHEN [Category 2] = TheMax THEN '[Category 2]'
WHEN [Category 3] = TheMax THEN '[Category 3]'
ELSE '[Category 4]'
END as BestCategory
from Customer
inner join maxValues
on Customer.[Customer] = maxValues.[Customer]
输出
| Customer | Category 1 | Category 2 | Category 3 | Category 4 | TheMax | BestCategory |
|---------------|------------|------------|------------|------------|--------|--------------|
| aaaaa@aaa.com | 0 | 563 | 0 | 0 | 563 | [Category 2] |
| bbbb@bbb.com | 33 | 31 | 38 | 13 | 38 | [Category 3] |
| cccc@ccc.com | 108 | 0 | 0 | 0 | 108 | [Category 1] |
| dddd@ddd.com | 0 | 7 | 0 | 11 | 11 | [Category 4] |
如果你想要 "greatest field" 中的列名,你可以使用这个 sqlfiddle example
中的想法
它选择每行具有最大值的列名
SELECT CASE
WHEN [category 1] > [category 2]
AND [category 1] > [category 3]
AND [category 1] > [category 4]
THEN '[Category 1]'
ELSE CASE
WHEN [category 2] > [category 1]
AND [category 2] > [category 3]
AND [category 2] > [category 4]
THEN '[Category 2]'
ELSE CASE
WHEN [category 3] > [category 1]
AND [category 3] > [category 2]
AND [category 3] > [category 4]
THEN '[Category 3]'
ELSE '[category 4]'
END
END
END
FROM customer
我有一个 table 看起来像这样:
table,
th,
td {
border: 1px solid black;
<table>
<tr>
<th>Customer</th>
<th>Category 1</th>
<th>Category 2</th>
<th>Category 3</th>
<th>Category 4</th>
</tr>
<tr>
<td>aaaaa@aaa.com</td>
<td>0</td>
<td>563</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>bbbb@bbb.com</td>
<td>33</td>
<td>31</td>
<td>38</td>
<td>13</td>
</tr>
<tr>
<td>cccc@ccc.com</td>
<td>108</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>dddd@ddd.com</td>
<td>0</td>
<td>7</td>
<td>0</td>
<td>11</td>
</tr>
</table>
我正在尝试插入一个名为 "BestCategory" 的新列,它将显示它们之间具有最高值的类别的名称。
我尝试使用 GREATEST,但我的系统不接受它。
你们能帮帮我吗?
首先你必须使用UNPIVOT
来计算每一行的maxValue
然后用一个CASE
来select什么BestCategory
.
WITH maxValues as
(
select
[Customer], Max(Amount) as TheMax
from
Customer
UNPIVOT (Amount for AmountCol in
([Category 1], [Category 2], [Category 3], [Category 4])) as unpvt
group by [Customer]
)
select
Customer.[Customer], [Category 1], [Category 2], [Category 3], [Category 4],
TheMax,
Case
WHEN [Category 1] = TheMax THEN '[Category 1]'
WHEN [Category 2] = TheMax THEN '[Category 2]'
WHEN [Category 3] = TheMax THEN '[Category 3]'
ELSE '[Category 4]'
END as BestCategory
from Customer
inner join maxValues
on Customer.[Customer] = maxValues.[Customer]
输出
| Customer | Category 1 | Category 2 | Category 3 | Category 4 | TheMax | BestCategory |
|---------------|------------|------------|------------|------------|--------|--------------|
| aaaaa@aaa.com | 0 | 563 | 0 | 0 | 563 | [Category 2] |
| bbbb@bbb.com | 33 | 31 | 38 | 13 | 38 | [Category 3] |
| cccc@ccc.com | 108 | 0 | 0 | 0 | 108 | [Category 1] |
| dddd@ddd.com | 0 | 7 | 0 | 11 | 11 | [Category 4] |
如果你想要 "greatest field" 中的列名,你可以使用这个 sqlfiddle example
中的想法它选择每行具有最大值的列名
SELECT CASE
WHEN [category 1] > [category 2]
AND [category 1] > [category 3]
AND [category 1] > [category 4]
THEN '[Category 1]'
ELSE CASE
WHEN [category 2] > [category 1]
AND [category 2] > [category 3]
AND [category 2] > [category 4]
THEN '[Category 2]'
ELSE CASE
WHEN [category 3] > [category 1]
AND [category 3] > [category 2]
AND [category 3] > [category 4]
THEN '[Category 3]'
ELSE '[category 4]'
END
END
END
FROM customer