Sql 根据物料主数据统计客户数量

Sql 根据物料主数据统计客户数量,sql,sql-server-2008,count,Sql,Sql Server 2008,Count,我需要您帮助我在SQL Server 2008中编写两个查询,根据item master显示以下信息: 从品牌角度看,依靠主顾加上购买品牌的客户 客户主数据加上购买项目的客户的项目计数 这里的链接显示了表信息和我尝试的查询 结果如下所示 我认为你需要重新考虑这份报告,也许可以将它分成多份报告 如果路由计数和分区计数是在不同的聚合级别上进行计数,则它们没有意义。所以有一个路线计数和分区计数报告 无论哪种方式,对于100PLUS,部门和路线都将为空,因为该品牌没有客户,这意味着没有可用的路线或部门

我需要您帮助我在SQL Server 2008中编写两个查询,根据item master显示以下信息:

  • 从品牌角度看,依靠主顾加上购买品牌的客户
  • 客户主数据加上购买项目的客户的项目计数
  • 这里的链接显示了表信息和我尝试的查询

    结果如下所示


    我认为你需要重新考虑这份报告,也许可以将它分成多份报告

    如果路由计数和分区计数是在不同的聚合级别上进行计数,则它们没有意义。所以有一个路线计数和分区计数报告

    无论哪种方式,对于100PLUS,部门和路线都将为空,因为该品牌没有客户,这意味着没有可用的路线或部门信息

    --Division Count
    SELECT BrandName, Division, COUNT(CustomerMaster.CustomerID) [Customer Count]
    FROM ItemMaster LEFT OUTER JOIN
          SalesData ON ItemMaster.BrandName = SalesData.Brand LEFT OUTER JOIN
          CustomerMaster ON SalesData.CustomerID = CustomerMaster.CustomerID
    GROUP BY BrandName, Division
    
    --Route Count
    SELECT BrandName, Route, Division, COUNT(CustomerMaster.CustomerID) [Customer Count]
    FROM ItemMaster LEFT OUTER JOIN
          SalesData ON ItemMaster.BrandName = SalesData.Brand LEFT OUTER JOIN
          CustomerMaster ON SalesData.CustomerID = CustomerMaster.CustomerID
    GROUP BY BrandName, Route, Division
    

    使用SQLFIDLE数据,有25个销售记录和18个不同的品牌/部门/路线/客户记录,没有销售记录

    select
            B.BrandName
          , V.Division
          , coalesce(Brand_count,0) as Brand_count
          , coalesce(Division_count,0) as Division_count
    from (select distinct BrandName from ItemMaster) as B
    cross join (select distinct Division from CustomerMaster) as V
    left join (
                select
                        Brand
                      , Division
                      , sum(cust_count) over (partition by Brand)    as Brand_count
                      , sum(cust_count) over (partition by Division) as Division_count
                from (
                      select
                              S.Brand
                            , C.Division
                            , count(distinct S.CustomerID) cust_count
                      from salesdata as S
                      inner join CustomerMaster as C
                                    on S.CustomerID  = C.CustomerID
                      inner join ItemMaster as I
                                    on S.item = I.ItemCode
                      group by
                              S.Brand
                            , C.Division
                      ) as S
              ) as D
                      on B.BrandName = D.Brand
                     and V.Division = D.Division
    order by
            B.BrandName
          , V.Division
    ;
    


    所有功劳归于@kevriley

    select 
    A.BrandName,
    B.Division,
    B.Route,
    B.DivisionTotalCustomers,
    B.RouteTotalCustomers,
    isnull(C.PurchasedCustomersCount,0) as PurchasedCustomersCount
    from 
    (
    select distinct
    BrandName, Route, Division
    from dbo.ItemMaster
    cross join dbo.CustomerMaster
    ) A
    join
    (
    select distinct
    Division,
    Route,
    DENSE_RANK() over (partition by Division order by c.CustomerID asc) + DENSE_RANK() over                  (partition by Division order by c.CustomerID desc) - 1 as DivisionTotalCustomers   ,
    DENSE_RANK() over (partition by ROUTE order by c.CustomerID asc) + DENSE_RANK() over     (partition by ROUTE order by c.CustomerID desc) - 1 as RouteTotalCustomers
    from    CustomerMaster c
        left join SalesData s on c.CustomerID = s.CustomerID
    ) B on B.Division = A.Division and B.Route = A.Route
    left join
    (
    select 
       s.brand,
       c.division,
       c.route,
       PurchasedCustomersCount = count(distinct C.CustomerID)
     FROM CustomerMaster c 
     JOIN SalesData s on c.CustomerID = s.CustomerID 
     --join ItemMaster i on s.item = i.itemcode
    GROUP by s.brand, c.division, c.route
    ) C on A.Brandname = C.Brand and C.Division = A.Division and C.Route = A.Route
    

    请参见

    上的相同内容,为什么您的示例不起作用?我有几个客户没有购买任何商品。在我的查询中,是路线中的客户计数,部门为空,这是错误的。那么,您是否希望排除没有人购买品牌的品牌?否则,这些字段将为空,因为它们来自客户主表,并且只有客户从该品牌购买了产品时才会出现?否,报告基于item master的品牌和customer master的客户计数。我想看到的是列出品牌,并在我的数据库中显示基于路线、部门的可用客户,同时显示主列表中有多少客户正在购买这些品牌。此外,在我的报告中,如果一个品牌没有被任何客户购买,但我仍然可以看到有多少潜在客户可用。客户在客户主目录中可用,我们可以计算他们,因为客户有路线和部门,如果该品牌没有被任何客户购买,我们可以显示为零。请检查,然后这正是您通过第二个查询得到的结果。它显示为零客户数量,因为品牌为零?问题是我没有每个部门和路线的可用客户数量可用客户的定义是什么?客户主信息中的所有客户我需要查看item master中的所有品牌,您的结果将只显示包含salesAll的项目您需要的是所有品牌的列表,然后将其用作您的from“table”,然后左键加入我提出的查询。当然,你最终会得到null,所以我让你用ISNULL或COALESCE来解决这些问题。我的朋友,品牌计数是错误的,它显示为null。您应该使用customer master和sales_count将客户计数为零这是我的问题,与我的结果和您的结果没有区别,我的原始问题保持不变。这就是我希望看到的,该电子表格的布局包含无法从SQLFIDLE的示例数据生成的结果。e、 g.没有一次销售涉及品牌100PLUS,因此我不知道如何达到预期结果,因为我无法从提供的原始数据中得出数字。但我会再看一眼,很快回来。
    | BRANDNAME | DIVISION | BRAND_COUNT | DIVISION_COUNT |
    |-----------|----------|-------------|----------------|
    |   100PLUS |    Dubai |           0 |              0 |
    |   100PLUS |      RAK |           0 |              0 |
    |     KITCO |    Dubai |           9 |             11 |
    |     KITCO |      RAK |           9 |              7 |
    |  Red Bull |    Dubai |           9 |             11 |
    |  Red Bull |      RAK |           9 |              7 |
    
    select 
    A.BrandName,
    B.Division,
    B.Route,
    B.DivisionTotalCustomers,
    B.RouteTotalCustomers,
    isnull(C.PurchasedCustomersCount,0) as PurchasedCustomersCount
    from 
    (
    select distinct
    BrandName, Route, Division
    from dbo.ItemMaster
    cross join dbo.CustomerMaster
    ) A
    join
    (
    select distinct
    Division,
    Route,
    DENSE_RANK() over (partition by Division order by c.CustomerID asc) + DENSE_RANK() over                  (partition by Division order by c.CustomerID desc) - 1 as DivisionTotalCustomers   ,
    DENSE_RANK() over (partition by ROUTE order by c.CustomerID asc) + DENSE_RANK() over     (partition by ROUTE order by c.CustomerID desc) - 1 as RouteTotalCustomers
    from    CustomerMaster c
        left join SalesData s on c.CustomerID = s.CustomerID
    ) B on B.Division = A.Division and B.Route = A.Route
    left join
    (
    select 
       s.brand,
       c.division,
       c.route,
       PurchasedCustomersCount = count(distinct C.CustomerID)
     FROM CustomerMaster c 
     JOIN SalesData s on c.CustomerID = s.CustomerID 
     --join ItemMaster i on s.item = i.itemcode
    GROUP by s.brand, c.division, c.route
    ) C on A.Brandname = C.Brand and C.Division = A.Division and C.Route = A.Route
    
    Select B.Brandname,B.Division,C AS DivisionTotalCustomerCount,
    ISNULL(T.Count,0) AS PURCHASEDCUSTOMERSCOUNT
    from 
    (
    Select CM.Division,M.BrandName,COUNT(distinct CM.CustomerID) AS C
    from dbo.CustomerMaster CM
    CROSS JOIN ItemMaster M 
    GROUP BY CM.Division,M.BrandName
    )B
    LEFT JOIN
    (Select Division,Brand,COUNT(Distinct C.CustomerID) As Count from CustomerMaster C
    JOIN salesdata D
    On C.CustomerID=D.CustomerID
    where D.Brand='Red Bull'
    GROUP BY Division,Brand
    )T
    ON B.Brandname=T.Brand
    and B.Division=T.Division
    Order by 1,2