2011-04-08 44 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