2017-05-27 76 views
1

我已经使用了SQL一段时间,但不会说我处于高级水平。我一直试图弄清楚自己无济于事。如何选择多个计数(*)值然后按特定列分组

我有两个表 - 交易TRANSACTIONTYPE

| **TransactionID** | **Name** | **TransactionTypeID** | 
| 1 | Tom | 1 | 
| 2 | Jim | 1 | 
| 3 | Mo | 2 | 
| 4 | Tom | 3 | 
| 5 | Sarah | 4 | 
| 6 | Tom | 1 | 
| 7 | Sarah | 1 | 


| **TransactionTypeID** | **TransactionType** | 
| 1 | A | 
| 2 | B | 
| 3 | C | 
| 4 | D | 

的Transaction.TransactionTypeID是Forein关键链接TransactionType.TransactionTypeID场。

这里是想什么我实现:

我想查询(这将是一个存储过程),返回三列:

名称 - 的价值Transaction.Name列。

NumberOfTypeATransactions - 该人的所有类型为'A'的交易的数量的计数。

NumberOfNonTypeATransactions - 不是该类型的所有事务数(即所有其他事务类型)的计数。

因此,使用上面的数据为例,结果集将是:

| **Name** | **NumberOfTypeATransactions** | **NumberOfNonTypeATransactions** | 
| Tom | 2 | 1 | 
| Jim | 1 | 0 | 
| Mo | 0 | 1 | 
| Sarah | 1 | 1 | 

我可能还需要根据日期时间(这将基于“交易日返回结果'列在交易表中,但我还没有最终确定这个要求。

任何帮助我如何能够实现这一点将不胜感激。表的布局道歉有点奇怪 - 还没有解决如何正确格式化它们

回答

1

This只是有条件的聚合与一个join

select t.name, 
     sum(case when tt.TransactionType = 'A' then 1 else 0 end) as num_As, 
     sum(case when tt.TransactionType <> 'A' then 1 else 0 end) as num_notAs 
from transaction t join 
    transactiontype tt 
    on tt.TransactionTypeID = t.TransactionTypeID 
group by t.name; 
+0

这似乎已经诀窍 - 感谢您的帮助! –

相关问题