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
我想将品牌的产品总数添加到总计栏中。
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