【问题标题】:Count number of records where all their relative dependant attributes belong to a specific list计算所有相关依赖属性都属于特定列表的记录数
【发布时间】:2016-11-20 22:20:20
【问题描述】:

为了解释我的问题,我将星型模式呈现如下:

SaleItem(事实)

  • SaleID(密钥)

  • ProductID(键)

  • 数量

  • 销售价格

销售(暗淡)

  • SaleID(密钥)

  • 销售日期

产品(暗淡)

  • ProductID(键)

  • 类别 ID (fk)

  • 产品名称

类别(暗淡)

  • CategoryID(键)

  • 类别名称

我想计算 2011CategoryId 为 Only = 4Sales (SaleID) 的数量。

我试过这样做:

SELECT        COUNT(DISTINCT SaleItem.SaleID) AS [Number of Bread-Only 2011 Sales]
FROM            Product INNER JOIN
                         SaleItem ON Product.ProductID = SaleItem.ProductID INNER JOIN
                         Sale ON SaleItem.SaleID = Sale.SaleID
WHERE        (YEAR(Sale.SaleDate) = '2011') AND (SaleItem.ProductID IN
                             (SELECT        ProductID
                               FROM            Product
                               WHERE        (CategoryID = '4')))

问题在于,我得到了 SaleID,其中 至少一个 ProductID 与 CategoryID=4 相关,如下所示:

但我希望所有相关的 ProductID 都与 CategoryID=4 相关或不计算在内。

更新解决方案

SELECT COUNT (X.SaleID) AS [Number of Bread-Only 2011 Sales] FROM 
((SELECT        DISTINCT SaleItem.SaleID
FROM            Product INNER JOIN
                         SaleItem ON Product.ProductID = SaleItem.ProductID INNER JOIN
                         Sale ON SaleItem.SaleID = Sale.SaleID
WHERE        (YEAR(Sale.SaleDate) = '2011') AND (SaleItem.ProductID IN
                             (SELECT        ProductID
                               FROM            Product
                               WHERE        (CategoryID = '4'))))
EXCEPT
(SELECT        DISTINCT SaleItem.SaleID
FROM            Product INNER JOIN
                         SaleItem ON Product.ProductID = SaleItem.ProductID INNER JOIN
                         Sale ON SaleItem.SaleID = Sale.SaleID
WHERE        (YEAR(Sale.SaleDate) = '2011') AND (SaleItem.ProductID IN
                             (SELECT        ProductID
                               FROM            Product  
                               WHERE        (CategoryID <> '4'))))) AS X

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    我认为应该这样做:

    (SELECT        DISTINCT SaleItem.SaleID
    FROM            Product INNER JOIN
                             SaleItem ON Product.ProductID = SaleItem.ProductID INNER JOIN
                             Sale ON SaleItem.SaleID = Sale.SaleID
    WHERE        (YEAR(Sale.SaleDate) = '2011') AND (SaleItem.ProductID IN
                                 (SELECT        ProductID
                                   FROM            Product
                                   WHERE        (CategoryID = '4'))))
    EXCEPT
    (SELECT        DISTINCT SaleItem.SaleID
    FROM            Product INNER JOIN
                             SaleItem ON Product.ProductID = SaleItem.ProductID INNER JOIN
                             Sale ON SaleItem.SaleID = Sale.SaleID
    WHERE        (YEAR(Sale.SaleDate) = '2011') AND (SaleItem.ProductID IN
                                 (SELECT        ProductID
                                   FROM            Product  
                                   WHERE        (CategoryID <> '4'))))
    

    【讨论】:

      【解决方案2】:

      如果我理解你的问题,你想计算2011年销售的第4类产品的销售数量。如果是这样的话,我猜下面的结果可以产生所需的结果。

      SELECT COUNT(*)
        FROM SaleItem as a
        JOIN Sale     as b ON b.SaleID = a.SaleID AND YEAR(b.SaleDate) = 2011
        JOIN Product  as c ON c.ProductID = a.ProductID and c.CategoryID = 4
      

      【讨论】:

        猜你喜欢
        • 2020-05-17
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多