Запрос SQL для получения суммы сумм на основе кода TaxType - PullRequest
0 голосов
/ 29 июля 2011

У меня есть данные таблицы следующим образом

EmpID    FedTaxID    TaxTypeCode   Amount
1059    888888888   TX02        2000
1059    888888888   TX02        3000
1059    888888888   TX03        5010

Я использую self join, чтобы получить общую сумму на основе FedTaxID and TaxTypeCode. Я пишу следующее

SELECT SUM(t1.Amount) AS Expr1, SUM(t2.Amount) AS Expr2 FROM tblTest AS t1 CROSS JOIN tblTest AS t2 WHERE (t1.FedTaxID = '888888888') AND (t2.FedTaxID = '888888888') AND (t1.TaxTypeCode = 'tx02') AND (t2.TaxTypeCode = 'tx03')

Но возвращается сумма следующим образом

 Expr1      Expr2 
 5000   10020

Мой ожидаемый результат -

 Expr1      Expr2 
  5000     5010

Так что любой может сказать, где я ошибся, пожалуйста. Также мне нужна общая сумма этих двух, так что любой может помочь мне в этом тоже

Ответы [ 5 ]

2 голосов
/ 29 июля 2011

Намного лучше использовать оператор "CASE" для такого рода вещей:

SELECT FedTaxId, SUM(tx02t) as tx02_tot , SUM(tx03t) as tx03tot , SUM(Txallt) as txnntot
  FROM (SELECT CASE WHEN  TaxTypeCode = 'tx02' THEN Amount else 0 END as tx02t,
               CASE WHEN  TaxTypeCode = 'tx03' THEN Amount else 0 END as tx03t,
               Amount as txallt
        FROM tbltest
        WHERE FedTaxID = '888888888'
       ) 
GROUP BY FedTaxId
1 голос
/ 29 июля 2011

Просто сделайте простое GROUP BY и используйте WITH ROLLUP для итогов:

SELECT 
    TaxTypeCode, SUM(Amount) 
FROM 
    tblTest 
WHERE
    FedTaxID = '888888888'
    AND TaxTypeCode IN ('TX02', 'TX03')
GROUP BY
    TaxTypeCode WITH ROLLUP

Должно дать вывод примерно так:

 TaxTypeCode    (No column name)
    TX02           5000
    TX03           5010
    NULL          10010              -- this is the line with the totals
1 голос
/ 29 июля 2011

У меня нет удобного экземпляра SQL для проверки моего синтаксиса, но вы можете сделать это с помощью PIVOT:

Select ['TX02'], ['TX03']
FROM
(
    Select TaxTypeCode, Sum(Amount) as Total
    From tblTest
    Group By TaxTypeCode
) as SourceTable
PIVOT
(
Sum(Total)
FOR TaxTypeCode IN (['TX02'], ['TX03'])
) AS PivotTable

UPDATE: С FedTaxID (опять же, с долей соли, у меня нет возможности проверить это прямо сейчас):

Select ['TX02'], ['TX03']
FROM
(
    Select FedTaxID, TaxTypeCode, Sum(Amount) as Total
    From tblTest
    Group By FedTaxID, TaxTypeCode
) as SourceTable
PIVOT
(
Sum(Total)
FOR TaxTypeCode IN (['TX02'], ['TX03'])
) AS PivotTable
0 голосов
/ 29 июля 2011

Ваше перекрестное объединение приводит к возврату двух строк данных, которые выглядят примерно так:

2000 5010
3000 5010

Итак, если вы подведете итоги, вы получите результат, который видите.

Я уверен, что это не самый лучший способ, но подзапросы сработают.

0 голосов
/ 29 июля 2011

Вы добавляете значение дважды, поэтому expr1 = 2000 + 3000 = 5000

Но expr вы добавляете также дважды, поэтому 5010 + 5010 = 10020.

Tjeu

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...