SQL select :关于SQL子查询 的一个问题
有如下的SQL 语句:
SELECT fAcc.id, fAcc.bankAccId, fAcc.closeDate,
fAcc.closeBalance, fAcc.isActive,
SUM(fTake.[value]) as financeValue,
(fAcc.closeBalance + SUM(fTake.[value])) as balance
FROM dbo.finance_account AS fAcc INNER JOIN
dbo.finance_taking AS fTake ON fTake.financeAccId = fAcc.Id AND
fTake.[date] > fAcc.closeDate
GROUP BY fAcc.id, fAcc.bankAccId, fAcc.closeDate, fAcc.closeBalance, fAcc.isActive,fAcc.viewLevel
这里 GROUP BY 子句后面列出的一大串完全是笨拙得让人抓急:在select 子句中每增加 finance_account 的一列那就要在 GROUP BY 子句中同时添加一次。怎么写这个 select 才好? (不想用聚合函数,因为这里的join 条件以及需要聚合的列都是很有可能要有变化的,一但用了函数,那么就可能因为该函数不可控而以后不好修改了) SQL select
[解决办法]
你这个group by不多啊,还有更长的你没见过呢,而且这个写法不是你看的不爽就可以不要的,有些写法它就是这样规定的。
[解决办法]
你是想知道简化的写法?只是写法?
SELECT
id
,bankAccId
,closeDate
,closeBalance
,isActive
,viewLevel
,SUM([value]) as financeValue
,(fAcc.closeBalance + SUM(fTake.[value])) as balance
FROM (
select fAcc.id id
,fAcc.bankAccId bankAccId
,fAcc.closeDate closeDate
,fAcc.closeBalance closeBalance
,fAcc.isActive isActive
,fAcc.viewLevel viewLevel
,fTake.[value] [value]
from dbo.finance_account AS fAcc
INNER JOIN dbo.finance_taking AS fTake
ON fTake.financeAccId = fAcc.Id AND fTake.[date] > fAcc.closeDate
) t
GROUP BY
id
,bankAccId
,closeDate
,closeBalance
,isActive
,viewLevel
[解决办法]
declare @val varchar(max)
declare @sql varchar(max)
set @val='facc.id,facc.bankaccid,facc.closedate,
facc.closebalance,facc.isactive'
set @sql='select '+@sql+',sum(ftake.[value]) as financevalue,(
facc.closebalance+sum(ftake.[value])) as balance from dbo.finance_account as
facc inner join dbo.finance_taking as ftake on ftake.financeaccid=
facc.id and ftake.[date]>facc.closedate group by '+@sql
exec (@sql)
不知道这样是不是楼主想要的。
[解决办法]
觉得静态SQL更好
[解决办法]
SELECT fAcc.id, fAcc.bankAccId, fAcc.closeDate,
fAcc.closeBalance, fAcc.isActive,
fTake.value as financeValue,
(fAcc.closeBalance + fTake.value) as balance
FROM dbo.finance_account AS fAcc INNER JOIN
(
SELECT financeAccId, SUM(value) as value
FROM dbo.finance_taking as t inner join finance_account t1 on t.financeAccId=t1.Id
WHERE t.date > fAcc.closeDate -- 这句就OK 或者使用cte的方式
GROUP BY financeAccId
) AS fTake ON fTake.financeAccId = fAcc.Id
[解决办法]
解决问题就好,然后再考虑效率
[解决办法]
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。该表达式源自简单查询,并且在单条 SELECT、INSERT、UPDATE 或 DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表表达式。
语法
[ WITH <common_table_expression> [ ,...n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,...n ] ) ]
AS
( CTE_query_definition )
[解决办法]
SELECT fAcc.id, fAcc.bankAccId, fAcc.closeDate,
fAcc.closeBalance, fAcc.isActive,
app.financeValue,
(fAcc.closeBalance + app.financeValue) as balance
FROM dbo.finance_account AS fAcc
cross apply
(select SUM(fTake.[value]) as financeValue
from dbo.finance_taking AS fTake where fTake.financeAccId = fAcc.Id AND
fTake.[date] > fAcc.closeDate
) app