2011-04-08 46 views
0

我有如下表:在SQL Server中使用GROUP BY子句返回两行08

acc_name  dr_amt  cr_amt 

Cash in hand 10000  0 
Share Capital 00  1000 
Cash in hand 2000  0 
Share Capital 0  2000.00 
Vehicles  5000  0 
Cash in hand 0   5000 

用下面的查询,

SELECT a.acc_name, sum(j.dr_amt) AS dr_sum, sum(j.cr_amt) AS cr_sum 
FROM  journal_voucher_details_mcg AS j 
INNER JOIN acc_head_mcg AS a ON a.acc_code = j.acc_code 
INNER JOIN journal_voucher_mcg AS jv ON jv.jv_no = j.jv_no 
WHERE  jv.jv_date = '2011-04-08' 
GROUP BY a.acc_name  

我能够得到如下结果:

acc_name  dr_sum cr_sum 

Cash in hand 3000 5000 
Share Capital 0  3000 
Vehicles  5000 0 

但我希望手中有两笔现金(对于既有dr_sum又有cr_sum大于0的任何入口),并且结果是d是如下:

acc_name  dr_sum cr_sum 

Cash in hand 3000 0 
Cash in hand 0  5000 
Share Capital 0  3000 
Vehicles  5000 0 

我还需要两dr_sum和cr_sum的总和,在这种情况下,应该是8000到两个....我的最终查询是

SELECT *, SUM(dr_sum), SUM(cr_sum) 
FROM (SELECT a.acc_name, sum(j.dr_amt) AS dr_sum, sum(j.cr_amt) AS cr_sum 
FROM  journal_voucher_details_mcg AS j 
INNER JOIN acc_head_mcg AS a ON a.acc_code = j.acc_code 
INNER JOIN journal_voucher_mcg AS jv ON jv.jv_no = j.jv_no 
WHERE  jv.jv_date = '2011-04-08' 
GROUP BY j.acc_code) 

但是这一次不是工作....将真正感谢你的努力家伙!

编辑

最终结果集:

acc_name  dr_sum cr_sum 

Cash in hand 3000 0 
Cash in hand 0  5000 
Share Capital 0  3000 
Vehicles  5000 0 
Total   8000 8000 

我无法显示“总”在过去的元组的第一场(字总计)。

回答

2

你有的当前SQL是好的,你不应该改变这一点。 如果您需要拆分并有两个条目分开,你可以这样做:

WITH W_RESULT AS (
    -- your current query goes here.... 
) 
SELECT acc_name, dr_sum, 0 AS cr_sum 
FROM W_RESULT 
WHERE dr_sum <> 0 
UNION 
SELECT acc_name, 0 AS dr_sum, cr_sum 
FROM W_RESULT 
WHERE cr_sum <> 0 

更新的解决方案,包括讨论形式如下意见

WITH W_RESULT AS (
    -- your current query goes here.... 
) 
SELECT acc_name, dr_sum, 0 AS cr_sum 
FROM W_RESULT 
WHERE dr_sum <> 0 
UNION 
SELECT acc_name, 0 AS dr_sum, cr_sum 
FROM W_RESULT 
WHERE cr_sum <> 0 
UNION ALL 
SELECT 'Total' AS acc_name, SUM(dr_sum), SUM(cr_sum) 
FROM W_RESULT 


前面的讨论......

为您可以添加到您的查询sum(j.dr_amt + j.cr_amt) AS t_sum的总和,如果你需要这也作为单独的条目在结果集y ou可以使用带有附加列和一个额外UNION节的WITH-clause和UNION扩展上述解决方案。或者甚至更简单的是这样的:

WITH W_RESULT AS (
    -- your current query goes here.... 
) 
SELECT acc_name, dr_sum, 0 AS cr_sum, 0 AS t_sum 
FROM W_RESULT 
WHERE dr_sum <> 0 
UNION 
SELECT acc_name, 0 AS dr_sum, cr_sum, 0 AS t_sum 
FROM W_RESULT 
WHERE cr_sum <> 0 
UNION 
SELECT acc_name, 0 AS dr_sum, 0 AS cr_sum, dr_sum + cr_sum AS t_sum 
FROM W_RESULT 

重要

从我指的是这个问题当前的查询是第一位的。
问题结尾处的“最终查询”有点奇怪。

它确实像

  • 总和的 “现金在手3000” + “车辆5000”= 8000为 “在手现金5000” dr_sum
  • 总和+ “股本3000”= 8000作为cr_sum

我假设请求了total_sum,做类似

  • 总和的“现金在手30在手5000 00" + “现金”= 8000作为t_sum
  • 总和的 “股本3000”= 3000作为t_sum
  • 总和的 “车辆5000”= 5000作为t_sum

请添加评论女巫总数是正确的。

+0

我需要分别dr_sum柱cr_column所有金额的总和......所以你的第一个假设是正确的。我希望总和显示为最终的元组,像'... UNION SELECT SUM(dr_sum),SUM(cr_sum)FROM W_RESULT'。但是我不能让“Total”这个词在最后一个元组中显示为一个字段。请参阅上面的编辑以获得进一步的说明。 – mannyee 2011-04-10 05:34:51

+0

加入这个联盟应该做的伎俩。 'UNION SELECT'Total'AS acc_name,SUM(dr_sum),SUM(cr_sum)FROM W_RESULT' – 2011-04-10 11:47:33

+0

用完整的解决方案更新了答案。 (使用'UNION ALL'添加最后一个'Total'将把它作为最后一行) – 2011-04-11 14:50:25

1

EDITED看到明确的要求后。

WITH groups AS (
    SELECT 
    a.acc_name, 
    dr_sum = sum(j.dr_amt), 
    cr_sum = sum(j.cr_amt) 
    FROM journal_voucher_details_mcg AS j 
    INNER JOIN acc_head_mcg AS a ON a.acc_code = j.acc_code 
    INNER JOIN journal_voucher_mcg AS jv ON jv.jv_no = j.jv_no 
    WHERE jv.jv_date = '2011-04-08' 
    GROUP BY j.acc_code, CASE WHEN dr_amt > 0 THEN 1 ELSE 2 END 
) 

SELECT 
    acc_name, 
    dr_sum, 
    cr_sum 
FROM groups 

UNION ALL 

SELECT 
    'Total', 
    SUM(dr_sum), 
    SUM(cr_sum) 
FROM groups 
+0

我只需要一个元组用于总借记和贷项总额......目前这个查询给了我两列,总值重复。 – mannyee 2011-04-10 05:22:43

+1

@mannyee:更新了答案。 – 2011-04-10 14:02:05

1
;with cte as 
(
    select 
    a.acc_name, 
    case n.n when 1 then sum(j.dr_amt) else 0 end as dr_sum, 
    case n.n when 2 then sum(j.cr_amt) else 0 end as cr_sum 
    from journal_voucher_details_mcg as j 
    inner join acc_head_mcg as a 
     on a.acc_code = j.acc_code 
    inner join journal_voucher_mcg as jv 
     on jv.jv_no = j.jv_no 
    cross join (select 1 union all select 2) as n(n) 
    where jv.jv_date = '2011-04-08' 
    group by a.acc_name, n.n 
) 
select 
    acc_name, 
    dr_sum, 
    cr_sum 
from cte 
where not (dr_sum = 0 and cr_sum = 0) 
union all 
select 
    'Total', 
    sum(dr_sum), 
    sum(cr_sum) 
from cte 
0

在SQL Server 2008(在2008年的新功能),你可以添加一个WITH ROLLUPGROUP BY

SELECT 
     a.acc_name, sum(j.dr_amt) AS dr_sum, sum(j.cr_amt) AS cr_sum 
FROM   
     journal_voucher_details_mcg AS j 
INNER JOIN 
     acc_head_mcg AS a ON a.acc_code = j.acc_code 
INNER JOIN 
     journal_voucher_mcg AS jv ON jv.jv_no = j.jv_no 
WHERE  
     jv.jv_date = '2011-04-08' 
GROUP BY  
     j.acc_code WITH ROLLUP 

在这种情况下,你会得到更多的行,其中acc_code为NULL - 这是您所有帐户的总计。

所以,你的新的输出应该是这个样子:

acc_name  dr_sum cr_sum 

Cash in hand 3000  0 
Cash in hand 0   5000 
Share Capital 0   3000 
Vehicles  5000  0 
NULL   8000  8000 <-- that's the line with the totals