如何选择多个计数(*)值,然后按特定列分组

时间:2017-05-27 12:09:47

标签: sql stored-procedures ssms

我已经使用了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 Key链接的 TransactionType.TransactionTypeID 字段。

以下是我想要实现的目标:

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

名称 - Transaction.Name列的值。

NumberOfTypeATransactions - 类型' A'的所有交易次数的计数。那个人。

NumberOfNonTypeATransactions - 该人员不属于A类型的所有交易的数量,即所有其他交易类型。

因此,以上述数据为例,结果集为:

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

我可能还需要根据日期(根据交易表中的交易日期&#39;列)返回结果,但我还没有最终确定此要求。< / p>

如何帮助我实现这一目标将不胜感激。表格布局的道歉有点奇怪 - 还没有找到如何正确格式化它们。

1 个答案:

答案 0 :(得分:1)

这只是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;