Rắc rối với SQL và tổng hợp


7

Với truy vấn này:

SELECT SUM(qty) AS sumQty,
       cnetprodid
FROM   quoteitem
WHERE  ordered = 1
       AND sageSOPOrderReturnLineID IS NOT NULL
       AND LEN(LTRIM(RTRIM(cnetprodid))) > 0
       AND cnetprodid LIKE 'S%'
       AND price > 10
       AND created > DATEADD(MONTH, -3, GETDATE())
GROUP  BY cnetprodid
ORDER  BY SUM(qty) DESC 

Tôi nhận lại một hàng cho mỗi sản phẩm, hàng trên cùng có 294 sumQtyvà 'S10381902' làcnetprodid

Nhập truy vấn này:

SELECT SUM(qty) AS sumQty,
       p.ProdID,
       p.CatID
FROM   quoteitem
       INNER JOIN cds_prod AS p
         ON p.ProdID COLLATE Latin1_General_CI_AS = cnetprodid
       INNER JOIN cds_atr AS a
         ON a.ProdID COLLATE Latin1_General_CI_AS = p.ProdID
       INNER JOIN lan_cat_sections AS c
         ON c.attID = a.atrID
             OR ( LEN(ISNULL(c.attID, '')) = 0
                  AND c.cat_id LIKE p.CatID + '%' )
                AND ( ( c.[include] = 0
                        AND a.valID NOT IN (SELECT Value
                                            FROM   Split(c.valID, ',')) )
                       OR ( c.[include] = 1
                            AND a.valID IN (SELECT Value
                                            FROM   Split(c.valID, ',')) ) )
WHERE  ordered = 1
       AND sageSOPOrderReturnLineID IS NOT NULL
       AND LEN(LTRIM(RTRIM(cnetprodid))) > 0
       AND cnetprodid LIKE 'S%'
       AND price > 10
       AND created > DATEADD(MONTH, -3, GETDATE())
GROUP  BY p.ProdID,
          p.CatID,
          a.prodID
HAVING SUM(qty) > 10
ORDER  BY SUM(qty) DESC 

Tôi nhận được một hàng cho mỗi sản phẩm trở lại nhưng bây giờ hàng có 'S10381902' vì ProdIDcột có số liệu là 8820 sumQty.

Tất cả những gì tôi muốn là một con số cho bao nhiêu sản phẩm đã được bán trong quý vừa qua, không quan tâm đến các sản phẩm đã bán dưới 10 đơn vị, do đó là HAVINGmột phần.

COLLATEbởi vì các bảng đến từ các cơ sở dữ liệu khác nhau; một là trong SQL_Latin1_General_CP1_CI_ASvà một cơ sở dữ liệu khác là trong Latin1_General_CI_AS.

Câu đố: http://sqlfiddle.com/#!3/ce1ed/4

Câu trả lời:


5

Vấn đề có thể xảy ra là, bằng cách tham gia vào các bảng bổ sung đó, các hàng trong quoteitem trở thành đại diện nhiều lần trong kết quả trung gian. Đó là, bạn có một tham gia một-nhiều tại một số điểm. SQL Server sau đó ngoan ngoãn tổng hợp các hàng đó nhiều lần. Đó là một sai lầm rất dễ mắc phải.

Cách giải quyết đơn giản là thực hiện các phép tính tổng hợp của bạn trước khi thực hiện bất kỳ phép nối một-nhiều. Nó có thể trông giống như thế này.

SELECT q.sumQty,
       p.ProdID,
       p.CatID
FROM (
        SELECT ProdID, SUM(qty) AS sumQty, ...other columns...
        FROM quoteitem
        GROUP BY ProdID
        HAVING SUM(qty) > 10
    ) q
       INNER JOIN cds_prod AS p
         ON p.ProdID COLLATE Latin1_General_CI_AS = cnetprodid
       INNER JOIN cds_atr AS a
         ON a.ProdID COLLATE Latin1_General_CI_AS = p.ProdID
       INNER JOIN lan_cat_sections AS c
         ON c.attID = a.atrID
             OR ( LEN(ISNULL(c.attID, '')) = 0
                  AND c.cat_id LIKE p.CatID + '%' )
                AND ( ( c.[include] = 0
                        AND a.valID NOT IN (SELECT Value
                                            FROM   Split(c.valID, ',')) )
                       OR ( c.[include] = 1
                            AND a.valID IN (SELECT Value
                                            FROM   Split(c.valID, ',')) ) )
WHERE  ordered = 1
       AND sageSOPOrderReturnLineID IS NOT NULL
       AND LEN(LTRIM(RTRIM(cnetprodid))) > 0
       AND cnetprodid LIKE 'S%'
       AND price > 10
       AND created > DATEADD(MONTH, -3, GETDATE())
GROUP  BY p.ProdID,
          p.CatID,
          a.prodID
ORDER  BY q.sumQty DESC 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.