首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL select :关于SQL子查询 的一个有关问题

2013-07-08 
SQL select :关于SQL子查询 的一个问题有如下的SQL 语句:SELECTfAcc.id, fAcc.bankAccId, fAcc.closeDate,

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)



不知道这样是不是楼主想要的。
[解决办法]
觉得静态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 

热点排行