日期:2014-05-17  浏览次数:20528 次

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

------解决方案--------------------
引用:
Quote: 引用:

要不用动态拼接。

啥意思?怎么弄?


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)