#sql #sql-server #tsql
Вопрос:
Мне было поручено отредактировать запрос, но я не мог выполнить операцию, которую хотел. Прежде всего, вывод запроса, который я хочу объяснить, выглядит следующим образом:
FacilityName AmountWithoutDiscount DiscountedAmount
Atlantis 18.305 12.335
OneTower 4.595 3.168
Panora 10.043 6.831
Grand Total 32.944 22.334
Мой вопрос:
SELECT DISTINCT g.FacilityName, SUM(g.BrutPrice) AS AmountWithoutDiscount, SUM(g.NetPrice) AS DiscountedAmount
From(
SELECT e.FacilityName, b.ItemAmount, b.BrutPrice, b.NetPrice,
(SELECT DISTINCT f.ProductId FROM FAZIKI.dbo.NM_ProductCampaign f WHERE c.Id = f.ProductId AND (f.IsActive=1) AND (f.CampaignId='7') AND (f.ProductId IS NOT NULL)) as Product
FROM FAZIKI.dbo.PM_InvoiceInformation a
INNER JOIN FAZIKI.dbo.PM_InvoiceDetail b ON a.Id = b.InvoiceId
INNER JOIN FAZIKI.dbo.PM_Product c ON b.ProductId = c.Id
INNER JOIN FAZIKI.dbo.DF_GNFacility e ON a.FacilityId = e.Id
WHERE(a.InvoiceDate > CONVERT(DATETIME, '2021-11-08 00:00:00', 102)) AND (a.InvoiceType = 2) AND (a.IsFromNCR = 1)
AND (c.RayonId = 1) AND (b.BrutPrice <> b.NetPrice) AND (a.IsCancel = 0)) AS g
WHERE g.Product IS NOT NULL
GROUP BY g.FacilityName,g.BrutPrice, g.NetPrice
результат запроса:
FacilityName AmountWithoutDiscount DiscountedAmount
Atlantis 8.50 5.74
Atlantis 8.50 5.75
Atlantis 8.50 5.77
.
.
.
OneTower 8.50 5.70
OneTower 8.50 5.83
OneTower 8.50 5.87
.
.
.
Panora 8.50 5.66
Panora 8.50 5.78
Panora 8.50 5.81
Как я могу получить сумму результатов моего запроса, как в поле, о котором я упоминал выше, и сумму каждого магазина? Я довел свой запрос до определенного момента, но большего сделать не смог. Вы не могли бы мне помочь?
Комментарии:
1. Просто несколько советов: А
GROUP BY
вместе с аDISTINCT
почти всегда неверно. Кроме того, подумайте о том, что происходит, когда выGROUP BY
используете колонку, которую вы также используетеSUM()
на2. Пожалуйста, предоставьте примеры исходных данных.
3. Причина, по которой я добавил DISTINCT, заключалась в том, чтобы свести названия магазинов к отдельным данным, но я не смог. После удаления DISCINT результат также не изменился. Я хочу уменьшить поле, в котором указано имя объекта, до 3 в общей сложности. То есть запись и сумма всех из них. Вы не могли бы мне помочь? @HoneyBadger
4. Основная проблема заключается в том, что вы группируете данные по тем столбцам, которые хотите суммировать.
5. Когда я удалил Group by, на этот раз «Столбец» g.Имя объекта «недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY». Я получаю ошибку в SQL. Когда я использую Group by, я не могу собрать столбцы, как вы сказали. @KnutBoehnert
Ответ №1:
Я думаю, что вы должны удалить из своего запроса:
- Различно — нет смысла иметь «группу по» и «различно».
- g.BrutPrice и g.NetPrice из группы by. Если они у вас в группе по, нет смысла использовать для них функцию агрегирования, такую как «сумма».
так:
SELECT g.FacilityName, SUM(g.BrutPrice) AS AmountWithoutDiscount, SUM(g.NetPrice) AS DiscountedAmount
From(
SELECT e.FacilityName, b.ItemAmount, b.BrutPrice, b.NetPrice,
(SELECT DISTINCT f.ProductId FROM FAZIKI.dbo.NM_ProductCampaign f WHERE c.Id = f.ProductId AND (f.IsActive=1) AND (f.CampaignId='7') AND (f.ProductId IS NOT NULL)) as Product
FROM FAZIKI.dbo.PM_InvoiceInformation a
INNER JOIN FAZIKI.dbo.PM_InvoiceDetail b ON a.Id = b.InvoiceId
INNER JOIN FAZIKI.dbo.PM_Product c ON b.ProductId = c.Id
INNER JOIN FAZIKI.dbo.DF_GNFacility e ON a.FacilityId = e.Id
WHERE(a.InvoiceDate > CONVERT(DATETIME, '2021-11-08 00:00:00', 102)) AND (a.InvoiceType = 2) AND (a.IsFromNCR = 1)
AND (c.RayonId = 1) AND (b.BrutPrice <> b.NetPrice) AND (a.IsCancel = 0)) AS g
WHERE g.Product IS NOT NULL
GROUP BY g.FacilityName
Комментарии:
1. ДА. Совершенно верно. Я думал, что мне следует объединить их всех в группу, но это отключает функции суммирования. ДИСКИНТ также был ненужным выражением. Большое вам спасибо, я вам очень благодарен.