首先我的SQL非常生疏,我相信我需要在这里做一个小组,但每次尝试我都会收到错误
无法比较或排序text,ntext和image数据类型,除非使用IS NULL或LIKE运算符
我有以下表格
Transactions
TransId | AccountId | PayeeId | TransAmount | CatId | SubCatId | TransDate
1 | 1 | 1 | 100.00 | 2 | 1 | 01/02/2018
2 | 1 | -1 | 50.00 | 3 | -1 | 01/02/2018
3 | 2 | 2 | 150.00 | 4 | 5 | 03/02/2018
Payee
PayeeId | PayeeName
1 | Employer 1
2 | Woolworths
Category
CatId | CatName
1 | Bills
2 | Income
3 | Transfer
4 | Groceries
SubCategory
SubCatId | SubCategoryName | CatId
1 | Salary | 2
2 | Rent | 1
3 | Taxes | 1
4 | Interest | 2
5 | Food | 4
到目前为止我的SQL是
SELECT TransId, Transdate, PayeeName, TransAmount
FROM Transactions AS t
left JOIN Payee AS p ON t.PayeeId = p.PayeeId
join Category as c on c.CATEGID = t.CATEGID
WHERE
t.AccountId = 1
order by Date Desc
在大多数情况下,他的实际工作,除非我尝试连接下面的两个字符串(SQLite)代码(我有问题让Concat在MSSQL Express中工作)
CATEGNAME || “:”|| SubCat.SUBCATEGNAME为Category
SELECT TransId, Transdate, PayeeName, TransAmount,
CatName || " : " || SubCategoryName as Category
FROM Transactions AS t
left JOIN Payee AS p ON t.PayeeId = p.PayeeId
join Category as c on c.CATEGID = t.CATEGID
join SubCategory as sc on sc.CATEGID = c.CATEGID
WHERE
t.AccountId = 1
order by Date Desc
该查询返回每个SubCategory的记录,我相信我需要在查询中使用group by。问题在于每次我尝试时,我都会收到上面提到的错误。
所以有两个问题,需要做些什么才能让它返回数据而不为每个子类别添加额外的行,以及concat如何在MS SQL中工作以实现我的需要。因为Concat似乎在列上工作,所以在两者之间加上“:”并不会和我一起玩。
任何帮助或方向都会很棒。
修改
我现在有点工作了。
SELECT TransId, Transdate, PayeeName, TransAmount,
CatName || " : " || SubCategoryName as Category
FROM Transactions AS t
left JOIN Payee AS p ON t.PayeeId = p.PayeeId
left join Category as c on c.CATEGID = t.CATEGID
left join SubCategory as sc on sc.CATEGID = t.CATEGID
WHERE
t.AccountId = 1
order by Date Desc
除了MS SQLite有一个问题,而不是类别为null,concat执行此操作
Bill :
SQLite本身返回预期的null,是
concat(CATEGNAME , ' : ' , SUBCATEGNAME)
在MSSQLite中执行此操作的正确方法?
编辑2:
预期结果
TransId | Transdate | PayeeName | TransAmount | Category
----------------------------------------------------------
1 | 01/02/2018 | Employer 1 | 100 | Income : Salary
现在CatId可以为null,SubCatId也可以为
因此,如果CatId为null,则Category应为null
如果Sub Cat为null,则Category应为“Income”
如果两者都有值,则Category应该与返回的上述记录显示相同。我希望这是有道理的。
编辑3:
好好玩了一下后,我设法让它在SQLite中工作,并在查询中添加了以下代码
CASE WHEN SUBCATEGNAME IS NULL then CATEGNAME else
CASE WHEN CATEGNAME IS NULL then '' else CATEGNAME || ' : ' || SUBCATEGNAME END
end as Category,
在MS SQlite中,我能够使用以下代码来实现它。
CASE WHEN SUBCATEGNAME IS NULL then CATEGNAME else
CASE WHEN CATEGNAME IS NULL then '' else concat(CATEGNAME, ' : ', SUBCATEGNAME) END
end as Category,
现在我想,这有效,但我希望有更多的跨数据库解决方案。目前我正在使用MS SQLite,但我不确定我是否会坚持使用它。或者,将该查询转换为实体框架会更好吗?