возвращение двух строк с использованием предложения GROUP BY на сервере sql 08 - PullRequest
0 голосов
/ 08 апреля 2011

У меня есть следующая таблица:

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   

Но я хочу две записи для Cash in hand (и для любой записи, у которой dr_sum и cr_sum больше 0), и результат должен быть следующим:

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

Я не могу отобразить «Всего» (слово Итого) в первом поле последнего кортежа.

Ответы [ 4 ]

2 голосов
/ 08 апреля 2011

текущий 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, и если вам это нужно также в качестве отдельной записи в наборе результатов, вы можете расширить вышеуказанное решение, используя WITH-предложение и UNION с дополнительным столбцом и одним дополнительным 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 как dr_sum
  • сумма «Денежные средства в кассе 5000» + «Акционерный капитал 3000» = 8000 как cr_sum

Я предполагал, что было запрошено total_sum, что-то вроде

  • сумма «Денежные средства в кассе 3000» + «Денежные средства в кассе 5000» = 8000 при сумме
  • сумма "Уставного капитала 3000" = 3000 как сумма
  • сумма «Транспортные средства 5000» = 5000 как сумма

Пожалуйста, добавьте комментарий, правильная сумма.

1 голос
/ 08 апреля 2011
;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
1 голос
/ 08 апреля 2011

отредактировано после просмотра уточненного требования.

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 голосов
/ 08 апреля 2011

В SQL Server 2008 (новая функция в 2008 году) вы можете добавить WITH ROLLUP к вашему GROUP 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...