Добавьте мои продажи вместе на основе идентификатора и имени, используя функцию SUM - PullRequest
0 голосов
/ 06 ноября 2019

Я создал запрос с SSMS:

SELECT 
    CONCAT(LastName,' ', FirstName) AS [Nom du vendeur], 
    SalesPersonID, 
    DATEPART(YYYY, [OrderDate]) AS [Annee], 
    FORMAT(SUM(soh.SubTotal), '#,#00.') AS [Ventes]
FROM 
    Sales.SalesOrderHeader AS soh 
INNER JOIN 
    Person.Person AS pp ON soh.SalesPersonID = pp.BusinessEntityID
WHERE 
    pp.PersonType = 'SP' 
    AND soh.OnlineOrderFlag = '0' 
    AND OrderDate NOT BETWEEN CONVERT(DATETIME, '01/01/2011', 101) AND CONVERT(DATETIME, '12/31/2011', 101) 
GROUP BY 
    SubTotal, OrderDate, SalesPersonID,LastName, FirstName
ORDER BY  
    [Annee], [Nom du vendeur]

И вот мой вывод:

enter image description here

Как видитев столбце [ventes], который представляет столбец продаж, продажи не складываются в зависимости от номера Id и имени, но я использую функцию SUM() в моем выборе. Любые идеи относительно того, что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Проблема в том, что вы group by:

  1. Вы не хотите group by SubTotal при суммировании этого столбца.
  2. И вы нехотите group by OrderDate, когда вы пытаетесь подвести итоги за год. Скорее вы хотите group by то же вычисление, которое вы выбираете, например DATEPART(YYYY, [OrderDate]).

Таким образом, ваше исправленное group by равно:

GROUP BY DATEPART(YYYY, [OrderDate]), SalesPersonID, LastName, FirstName

К вашему сведению: если вы разместите свойвопросы в формате, аналогичном приведенному ниже, например, Минимальный воспроизводимый пример , благодаря которому люди намного легче и с большей вероятностью могут помочь.

declare @SalesOrderHeader table (id int, SalesPersonID int, OrderDate datetime, SubTotal money, OnlineOrderFlag varchar(1))
declare @Person table (id int, FirstName varchar(64), LastName varchar(64), BusinessEntityID int, PersonType varchar(2))

insert into @Person (id, BusinessEntityID, FirstName, LastName)
  select 1, 1, 'Amy', 'Alberts' union all
  select 2, 2, 'Pamela', 'Ansman-Wolfe'

insert into @SalesOrderHeader (SalesPersonID, OrderDate, SubTotal)
  select 1, '5 nov 2019', 12.34 union all
  select 1, '6 nov 2019', 34.56 union all
  select 2, '7 nov 2019', 78.90 union all
  select 2, '8 nov 2019', 43.21

SELECT 
  CONCAT(LastName,' ', FirstName) AS [Nom du vendeur] 
  , SalesPersonID 
  , DATEPART(YYYY, [OrderDate]) AS [Annee] 
  , FORMAT(SUM(soh.SubTotal), '#,#00.') AS [Ventes]
FROM @SalesOrderHeader AS soh 
INNER JOIN @Person AS pp ON soh.SalesPersonID = pp.BusinessEntityID
--WHERE 
--    pp.PersonType = 'SP' 
--    AND soh.OnlineOrderFlag = '0' 
--    AND OrderDate NOT BETWEEN CONVERT(DATETIME, '01/01/2011', 101) AND CONVERT(DATETIME, '12/31/2011', 101) 
-- GROUP BY SubTotal, OrderDate, SalesPersonID,LastName, FirstName
GROUP BY DATEPART(YYYY, [OrderDate]), SalesPersonID, LastName, FirstName
ORDER BY [Annee], [Nom du vendeur]

Возвращает:

Nom du vendeur      | SalesPersonID | Annee | Ventes
----------------------------------------------------
Alberts Amy         | 1             | 2019  | 47
Ansman-Wolfe Pamela | 2             | 2019  | 122
0 голосов
/ 06 ноября 2019

Как уже упоминалось в комментариях,

удаляет промежуточный итог из предложения group by, агрегированные значения не обязательно должны быть в предложении group by.

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