通过左加入类别表来计算交易数量

时间:2014-06-25 02:53:35

标签: sql sql-server left-join

希望获得有关如何实现以下内容的建议。我有两张桌子。一个叫做类别,另一个叫做Trxn。我试图找出每个类别中有多少交易。我知道我需要将我的Trxn表与Category表连接起来。但问题是,Category表中的CategoryId是6个字符,这个相同的ID在Trxn表中分为两列,分别为4和2字符列。

如何加入两个列并左键加入Category表。 ??可能吗。我的aspx应用程序必须显示每个类别中已完成的traxns数量。 我通过下面的SQLFiddle链接附加了一个示例数据库模式。

SELECT Category.ID, count(Trxn.Cat_ID) FROM Category
LEFT JOIN Trxn
on Category.ID = (Trxn.Cat_ID+Trxn.STV)
where Category.Status='A'
AND Trxn.Status='ok'
group by Category.ID

http://sqlfiddle.com/#!3/6feef/2/0

请建议。

4 个答案:

答案 0 :(得分:1)

你在where子句中有左外连接表的一部分。你不能这样做,它会使它成为一个普通的连接。

这有效:

SELECT
  Category.ID,
  COUNT(Trxn.Cat_ID)
FROM
  Category
LEFT JOIN
  Trxn
  ON Category.ID = (rtrim(Trxn.Cat_ID)+ltrim(Trxn.STV))
  AND Trxn.Status='ok'
WHERE Category.Status='A'
GROUP BY Category.ID

答案 1 :(得分:0)

由于某种原因,当你连接值时,cat_id之后有一个空格。我能够通过跑步找到这个。我刚注意到数据类型是一个字符。

select cat_id + stv from trxn

我修剪了空格,查询正在运行。

SELECT Category.ID, count(Trxn.Cat_ID) FROM Category
LEFT JOIN Trxn
on Category.ID = (rtrim(Trxn.Cat_ID)+ltrim(Trxn.STV)) AND Trxn.Status='ok'
where Category.Status='A'
group by Category.ID

答案 2 :(得分:0)

我认为当您使用Trxn.Cat_ID + Trxn.STV时,您的联接中的问题存在空间,这就是为什么它无法连接到您的类别表,因为没有这样的值,这里是我对你的问题的解决方案我已经自己测试了..如果你锻炼自己使用别名,你也可以更好地加入桌子:)

SELECT A.ID,count(A.ID) FROM Category A
LEFT JOIN Trxn B ON REPLACE(B.Cat_ID+B.STV,' ','') = A.ID
WHERE A.Status = 'A'
AND B.Status = 'ok'
GROUP BY A.ID

答案 3 :(得分:0)

运行以下查询时,

SELECT Trxn.Cat_ID,Trxn.STV, Trxn.Cat_ID+Trxn.STV
FROM TRXN;

输出为

CAT_ID |    STV | COLUMN_2
EBL01  |    06  | EBL01 06
EBL01  |    06  | EBL01 06
EBL02  |    06  | EBL02 06
EBL03  |    06  | EBL03 06

您将能够注意到COLUMN_2中必须删除的空间以进行比较。因此,尝试替换查询中的所有空格,它应该工作。也许你可以试试:

SELECT Category.ID, count(Trxn.Cat_ID) TRANSACTION_COUNT FROM Category
LEFT JOIN Trxn
on Category.ID = REPLACE(Trxn.Cat_ID+Trxn.STV,' ','')
where Category.Status='A'
AND Trxn.Status='ok'
group by Category.ID;

查询在小提琴中提供以下输出:

ID         | TRANSACTION_COUNT
EBL0106    |    2