sql cte 非重复计数

sql cte distinct count

我想将品牌的产品总数添加到总计栏中。

http://sqlfiddle.com/#!18/2d00a/1

这是我的查询;

WITH cte AS
(
    SELECT id 
    FROM category 
    WHERE id = 1 

    UNION ALL 

    SELECT c.id 
    FROM category c, cte 
    WHERE c.parentid = cte.id
), cte2 AS 
(
    SELECT brandid, d.catid 
    FROM products d, cte 
    WHERE d.catid = cte.id

    UNION ALL

    SELECT u.brandid, COUNT(DISTINCT u.id) 
    FROM products u, cte 
    WHERE catid = cte.id
    GROUP BY brandid
)
SELECT DISTINCT 
    brandid, logo, brand, id, id as total 
FROM
    brand, cte2 
WHERE 
    id = cte2.brandid 
ORDER BY 
    brand ASC

根据我的理解,这是获取每个品牌产品总数的查询。 DBFIDDLE 工作代码

CREATE TABLE brand (
    [id] INT
    ,[brand] VARCHAR(13)
    ,[logo] VARCHAR(13)
    );

INSERT INTO brand ([id], [brand], [logo])
VALUES ('1', 'samsung', 'logo.jpg');

CREATE TABLE products (
    [id] INT
    ,[name] VARCHAR(13)
    ,[catid] INT
    ,[brandid] INT
    );

INSERT INTO products ([id], [name], [catid], [brandid])
VALUES ('1', 'samsung tv', '2', '1')
    ,('1', 'samsung2 tv', '2', '1')

SELECT b.Id
    ,b.brand
    ,b.logo
    ,p.Id
    ,COUNT(1) [total]
FROM brand b
INNER JOIN products p ON b.Id = p.brandId
GROUP BY b.Id
    ,b.brand
    ,b.logo
    ,p.Id

结果:

SELECT b.id,
       b.logo,
       b.brand,
       count(p.id) total
FROM brand b
LEFT JOIN products p ON p.brandid = b.id
GROUP BY b.id, b.logo, b.brand

假设您要根据类别 1(您也包括子类别)过滤产品

WITH categories_and_subcategories AS (
   SELECT id FROM category 
   WHERE id = 1 
   UNION ALL 
   SELECT c.id 
   FROM category c 
   INNER JOIN categories_and_subcategories cs 
         ON c.parentid = cs.id),
filtered_products AS (
   SELECT p.id,
          p.name,
          p.catid,
          p.brandid 
   FROM products p
   INNER JOIN categories_and_subcategories c
         ON p.catid = c.id
   )
SELECT b.id,
       b.logo,
       b.brand,
       count(p.id) total
FROM brand b
LEFT JOIN filtered_products p ON p.brandid = b.id
GROUP BY b.id, b.logo, b.brand