SQL SUM Расчет - PullRequest
       6

SQL SUM Расчет

0 голосов
/ 15 апреля 2011

Я написал следующий запрос для расчета суммы.Как также этот запрос может отображать каждую отдельную запись, которая суммируется?

SELECT 'BEN' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = '4/1/2011' 
AND T5.Canceled = 'N' 
AND Checked = 'Y'
GROUP BY CardCode

Ответы [ 4 ]

3 голосов
/ 15 апреля 2011

Вы хотите использовать предложение WITH ROLLUP в вашем операторе SELECT. В зависимости от того, какой тип SQL-сервера вы используете, существует несколько различных синтаксисов.

MS SQL Server 2000/2005 будет выглядеть так:

SELECT 'BEN' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = '4/1/2011' AND T5.Canceled = 'N' AND Checked = 'Y'
GROUP BY CardCode WITH ROLLUP

Это вернет отдельные записи плюс дополнительную запись, где первое поле NULL, а второе поле SUM (). Обратите внимание, что вы можете сделать это с большим количеством уровней группировки, и это будет включать промежуточные итоги, а также соответствующие поля, равные NULL.

SQL Server 2008 имеет более ANSI-совместимый синтаксис, который делает то же самое:

SELECT 'BEN' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = '4/1/2011' AND T5.Canceled = 'N' AND Checked = 'Y'
GROUP BY ROLLUP(CardCode)

Насколько я помню, MySQL использует первую форму, а Oracle использует вторую форму.

EDIT:

Мой запрос на самом деле не дает желаемых результатов; ROLLUP () работает, беря существующую агрегатную функцию и рекурсивно выполняя ее для более широких и широких групп. Вам нужно иметь ряд строк без функции агрегирования и применять агрегат один раз.

Вы можете получить этот эффект, используя предложение COMPUTE BY, но они давно устарели, а результаты неопрятны, поэтому я бы их избегал. (Проверьте MSDN для деталей, если вы действительно хотите.)

Самый простой способ достичь своей цели - найти способ сделать каждую запись уникальной, например, включить поле первичного ключа, чтобы PayAmount и SUM (PayAmount) давали одинаковый результат, а затем выполнить сведение.

SELECT IdEntry, 'BEN' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = '4/1/2011' AND T5.Canceled = 'N' AND Checked = 'Y'
GROUP BY ROLLUP(CardCode, IdEntry)

Это даст вам результат, который выглядит примерно так:

1     BEN1234  1000
2     BEN1234  2000
3     BEN1234  1000
NULL  BEN1234  4000
4     BEN4567  1500
5     BEN4567  1500
6     BEN4567  1000
NULL  BEN4567  4000
NULL  NULL     8000

Дайте нам знать, если это сработает для вас.

1 голос
/ 15 апреля 2011
SELECT 'BEN' + CardCode, BENSALEM.dbo.PWZ3.*,
       SUM(PayAmount) OVER (PARTITION BY CardCode) sum_PayAmount
  FROM BENSALEM.dbo.PWZ3
 INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
 WHERE T5.PmntDate = '4/1/2011' 
   AND T5.Canceled = 'N' 
   AND Checked = 'Y'
1 голос
/ 15 апреля 2011

Вы не можете агрегировать и не агрегировать в одном запросе, но вы можете объединить два:

SELECT 'BEN' + CardCode, SUM(PayAmount) 
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = '4/1/2011' 
AND T5.Canceled = 'N' 
AND Checked = 'Y'
GROUP BY CardCode

UNION ALL  -- combine the two
SELECT 'BEN' + CardCode, PayAmount  -- not aggregating here, this will return all rows
FROM BENSALEM.dbo.PWZ3
INNER JOIN BENSALEM.dbo.OPWZ T5 ON T5.IdNumber = IdEntry
WHERE T5.PmntDate = '4/1/2011' 
AND T5.Canceled = 'N' 
AND Checked = 'Y'

edit : и так как вы указали MS SQL Server в ваших комментарияхМартин указывает, что вы можете использовать ROLLUP, чтобы сделать это в одном запросе. Прочитайте документ MSDN на ROLLUP здесь

0 голосов
/ 15 апреля 2011

Вам потребуется использовать второй запрос, чтобы получить нужные данные.Когда вы используете GROUP BY, вы получите только одну строку для каждого уникального значения в группе по столбцу.Обычно любое поле, добавляемое в список выбора, возвращает значение первой строки в группе.

Очевидно, что агрегатные функции, такие как SUM, возвращают результат функции для всех значений в группе.

...