SQL加入Group By

时间:2012-08-21 21:01:59

标签: sql join group-by

好的,所以我试图写一个复杂的查询(至少对我来说很复杂),需要一些亲的帮助。这是我的数据库设置:

表:MakeList

| MakeListId | Make     |
| 1          | Acura    |
| 2          | Chevy    |
| 3          | Pontiac  |
| 4          | Scion    |
| 5          | Toyota   |

表:CustomerMake

| CustomerMakeId | CustomerId | _Descriptor |
| 1              | 123        | Acura       |
| 2              | 124        | Chevy       |
| 3              | 125        | Pontiac     |
| 4              | 126        | Scion       |
| 5              | 127        | Toyota      |
| 6              | 128        | Acura       |
| 7              | 129        | Chevy       |
| 8              | 130        | Pontiac     |
| 9              | 131        | Scion       |
| 10             | 132        | Toyota      |

表:客户

| CustomerId | StatusId |
| 123        | 1        |
| 124        | 1        |
| 125        | 1        |
| 126        | 2        |
| 127        | 1        |
| 128        | 1        |
| 129        | 2        |
| 130        | 1        |
| 131        | 1        |
| 132        | 1        |

我最终想要的是......

期望的结果集:

| Make    | CustomerId|
| Acura   | 123       |
| Chevy   | 124       |
| Pontiac | 125       |
| Scion   | 131       |
| Toyota  | 127       |

我想要一个带有有效(StatusId = 1) CustomerId的独特制作列表。我假设我必须做一些GROUP BYsJOINS,但我还没能弄清楚。任何帮助将不胜感激。如果我没有为我的问题提供足够的信息,请告诉我。谢谢!

更新:脚本不具备高性能 - 它将被用于测试目的。

2 个答案:

答案 0 :(得分:2)

这样的事情:

select cm._Descriptor,
       min(cu.customerid)
from CustomerMake cm
  join Customer cu on cuo.CustomerId  = cm.CustomerId and cu.StatusId = 1
group by cm._Descriptor

我省略了MakeList表,因为它似乎没有必要,因为你在CustomerMake表中存储了完整的make name _Descriptor(所以问题是MakeList表是什么?为什么不存储在CustomerMake表中给它一个FK?)

答案 1 :(得分:1)

你想要

(a)加入客户和客户制表 (b)过滤customer.statusid
(c)按customermake._descriptor分组

根据您的RDBMS,您可能需要将组函数显式应用于customer.customerid,以将其包含在选择列表中。由于您不关心显示哪个特定的customerid,您可以使用MIN或MAX来选择一个基本上任意的值。