我正在编写一个SQL查询,它将从一个表中获取所有事务类型,而从另一个表中,它将计算该事务类型的频率。
我的疑问是:
with CTE as
(
select a.trxType,a.created,b.transaction_key,b.description,a.mode
FROM transaction_data AS a with (nolock)
RIGHT JOIN transaction_types b with (nolock) ON b.transaction_key = a.trxType
)
SELECT COUNT (trxType) AS Frequency, description as trxType,mode
from CTE where created >='2017-04-11' and created <= '2018-04-13'
group by trxType ,description,mode
transaction_types
表仅包含所有类型的交易,transaction_data
包含已发生的交易。
我面临的问题是即使它是RIGHT join
,它也不会从transaction_types
表中选择所有记录。
我需要从transaction_types
表中选择所有交易,并显示每笔交易的计数,即使它是0。
请帮忙。
答案 0 :(得分:6)
LEFT JOIN
更容易理解。
我想你想要:
select tt.transaction_key, tt.description, t.mode, count(t.trxType)
from transaction_types tt left join
transaction_data t
on tt.transaction_key = t.trxType and
t.created >= '2017-04-11' and t.created <= '2018-04-13'
group by tt.transaction_key, tt.description, t.mode;
注意:
a
和b
毫无意义。 t
和tt
是表名的缩写,因此更容易理解。t.mode
将为NULL
。ON
子句中。否则,外部联接将变为内部联接。LEFT JOIN
更容易理解(至少对于母语从左到右阅读的人),因为它意味着“保留您已阅读的表格中的所有行”。