Как мне уточнить этот запрос, чтобы возвращать отдельные идентификаторы продуктов с их суммированным количеством? - PullRequest
0 голосов
/ 08 мая 2018

это на самом деле продолжение этого вопроса.

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

    SELECT DISTINCT ld.ProductId, ld.Quantity,ld.UnitPrice ,
  STUFF((SELECT ',' + CAST(lh1.LandingId AS VARCHAR) FROM dbo.LandingHeaders lh1 WHERE (lh1.LandingDate  BETWEEN '20171101' AND '20171107') AND (lh1.VesselOwnerId = 42
  ) FOR XML PATH('')) ,1,1,'') AS LandingIds

  FROM LandingHeaders lh 
  JOIN LandingDetails ld ON lh.LandingId = ld.LandingId
  WHERE (lh.LandingDate BETWEEN '20171101' AND '20171107') AND (lh.VesselOwnerId = 42)
  GROUP BY ld.ProductId,lh.LandingId,ld.Quantity,ld.UnitPrice

enter image description here

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

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

SELECT  ld.ProductId, 
        SUM(ld.Quantity) Quantity,
        ld.UnitPrice,
        STUFF(( SELECT ',' + CAST(lh1.LandingId AS VARCHAR(20)) 
                FROM dbo.LandingHeaders lh1 
                WHERE lh1.LandingDate  BETWEEN '20171101' AND '20171107' 
                AND lh1.VesselOwnerId = 42 FOR XML PATH('')) ,1,1,'') AS LandingIds
FROM LandingHeaders lh 
INNER JOIN LandingDetails ld 
    ON lh.LandingId = ld.LandingId
WHERE lh.LandingDate BETWEEN '20171101' AND '20171107' 
AND lh.VesselOwnerId = 42
GROUP BY ld.ProductId,
         ld.UnitPrice
;
0 голосов
/ 08 мая 2018

Попробуйте это:

SELECT productId, SUM(quantity), MAX(unitprice)
FROM
(<your query>) as t
GROUP BY productId
...