【发布时间】:2012-06-11 02:54:26
【问题描述】:
我使用的是SQL Server 2008,我迫切需要sql查询或存储过程来显示任何类别或子类别中的顶级品牌。例如,如果我通过 IdCategory=2,结果集应该通过对 idCategory=2 及其子类别和子子类别执行产品计数来显示电子产品中的顶级品牌。如果我通过 IdCategory=38,结果应该会显示 Phones & Mobile Devices 以及 Mobile Phones 中的顶级品牌。我希望我能够清除我的要求。
这是我数据库中的表。
类别
IdCategory CategoryName ParentCategoryId
---------------------------------------------------------
1 Appliances Null
2 Electronics Null
38 Phones & Mobile Devices 2
39 Cameras & Photography 2
115 Mobile Phones 38
121 Digital Cameras 39
品牌
IdBrand BrandName
------------------------
1 Nokia
2 Samsung
3 Canon
下表打破了类别和品牌表之间的多对多关系
类别品牌
IdCategoriesBrand IdCategory IdBrand
-----------------------------------------
1 2 1
2 38 1
3 115 1
4 2 2
5 38 2
6 115 2
产品
IdProduct Product Name IdCategory IdBrand
---------------------------------------------------------
1 AAAA 115 1
2 BBBB 115 2
3 CCCC 121 3
4 DDDD 115 1
5 EEEE 121 3
关于产品表的假设
- 产品只能添加到第三级子子类别中(例如手机、数码相机)
这里是创建表的脚本
CREATE TABLE [dbo].[Categories](
[IdCategory] [bigint] NOT NULL,
[CategoryName] [nvarchar](50) NULL,
[ParentCategoryId] [bigint] NULL
CONSTRAINT [PK_Categories_IdCategory] PRIMARY KEY CLUSTERED ( [IdCategory] ASC )
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Brands](
[IdBrand] [bigint] NOT NULL,
[BrandName] [nvarchar](50) NULL
CONSTRAINT [PK_Brands_IdBrand] PRIMARY KEY CLUSTERED ( [IdBrand] ASC )
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[CategoriesBrands](
[IdCategoriesBrand] [bigint] NOT NULL,
[IdCategory] [bigint] NULL,
[IdBrand] [bigint] NULL,
CONSTRAINT [PK_CategoriesBrands] PRIMARY KEY CLUSTERED ( [IdCategoriesBrand] ASC )
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[CategoriesBrands] WITH CHECK ADD CONSTRAINT [FK_CategoriesBrands_Brands] FOREIGN KEY([IdBrand])
REFERENCES [dbo].[Brands] ([IdBrand])
GO
ALTER TABLE [dbo].[CategoriesBrands] CHECK CONSTRAINT [FK_CategoriesBrands_Brands]
GO
ALTER TABLE [dbo].[CategoriesBrands] WITH CHECK ADD CONSTRAINT [FK_CategoriesBrands_Categories] FOREIGN KEY([IdCategory])
REFERENCES [dbo].[Categories] ([IdCategory])
GO
ALTER TABLE [dbo].[CategoriesBrands] CHECK CONSTRAINT [FK_CategoriesBrands_Categories]
GO
CREATE TABLE [dbo].[Products](
[IdProduct] [bigint] NOT NULL,
[ProductName] [nvarchar](200) NULL,
[IdCategory] [bigint] NULL,
[IdBrand] [bigint] NULL
CONSTRAINT [PK_Products_IdProduct] PRIMARY KEY CLUSTERED ( [IdProduct] ASC )
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Products] WITH CHECK ADD CONSTRAINT [FK_Products_Brands] FOREIGN KEY([IdBrand])
REFERENCES [dbo].[Brands] ([IdBrand])
GO
ALTER TABLE [dbo].[Products] CHECK CONSTRAINT [FK_Products_Brands]
GO
ALTER TABLE [dbo].[Products] WITH CHECK ADD CONSTRAINT [FK_Products_Categories] FOREIGN KEY([IdCategory])
REFERENCES [dbo].[Categories] ([IdCategory])
GO
ALTER TABLE [dbo].[Products] CHECK CONSTRAINT [FK_Products_Categories]
GO
这里是在表格中插入一些示例数据的脚本
INSERT INTO Categories (IdCategory, CategoryName, ParentCategoryId) VALUES(1, 'Appliances', NULL)
INSERT INTO Categories (IdCategory, CategoryName, ParentCategoryId) VALUES(2, 'Electronics', NULL)
INSERT INTO Categories (IdCategory, CategoryName, ParentCategoryId) VALUES(38, 'Phones & Mobile Devices', 2)
INSERT INTO Categories (IdCategory, CategoryName, ParentCategoryId) VALUES(39, 'Cameras & Photography', 2)
INSERT INTO Categories (IdCategory, CategoryName, ParentCategoryId) VALUES(115, 'Mobile Phones', 38)
INSERT INTO Categories (IdCategory, CategoryName, ParentCategoryId) VALUES(121, 'Digital Cameras', 39)
INSERT INTO Brands (IdBrand, BrandName) VALUES(1, 'Nokia')
INSERT INTO Brands (IdBrand, BrandName) VALUES(2, 'Samsung')
INSERT INTO Brands (IdBrand, BrandName) VALUES(3, 'Canon')
INSERT INTO CategoriesBrands (IdCategoriesBrand, IdCategory, IdBrand) VALUES(1, 2, 1)
INSERT INTO CategoriesBrands (IdCategoriesBrand, IdCategory, IdBrand) VALUES(2, 38, 1)
INSERT INTO CategoriesBrands (IdCategoriesBrand, IdCategory, IdBrand) VALUES(3, 115, 1)
INSERT INTO CategoriesBrands (IdCategoriesBrand, IdCategory, IdBrand) VALUES(4, 2, 2)
INSERT INTO CategoriesBrands (IdCategoriesBrand, IdCategory, IdBrand) VALUES(5, 38, 2)
INSERT INTO CategoriesBrands (IdCategoriesBrand, IdCategory, IdBrand) VALUES(6, 115, 2)
INSERT INTO Products (IdProduct, ProductName, IdCategory, IdBrand) VALUES(1, 'AAAA', 115, 1)
INSERT INTO Products (IdProduct, ProductName, IdCategory, IdBrand) VALUES(2, 'BBBB', 115, 2)
INSERT INTO Products (IdProduct, ProductName, IdCategory, IdBrand) VALUES(3, 'CCCC', 121, 3)
INSERT INTO Products (IdProduct, ProductName, IdCategory, IdBrand) VALUES(4, 'DDDD', 115, 1)
INSERT INTO Products (IdProduct, ProductName, IdCategory, IdBrand) VALUES(5, 'EEEE', 121, 3)
到目前为止,我已经尝试过这个,它给了我前 5 个没有类别的品牌
SELECT TOP 5
b1.IdBrand,
ISNULL(b1.BrandName, '') AS BrandName,
count(p.IdProduct) AS 'ProductsCount'
FROM Brands b1
LEFT OUTER JOIN Products p
ON b1.IdBrand = p.IdBrand
GROUP BY b1.IdBrand, b1.BrandName
ORDER BY ProductsCount DESC
【问题讨论】:
-
它更像是您在此处委派的作业/家庭作业。
-
一些用于创建表和插入的脚本也会有所帮助 - 我只需要
Products和Categories的脚本 -
不,这不是家庭作业/作业,实际上我创建了一个消费品评论网站并停留在此查询上。这是您询问的完整脚本。
-
我在您的表格中看不到任何销售或可靠性数据。如何确定顶级品牌?
-
在不久的将来,我将添加评论表,该表将根据评论确定顶级品牌。目前我想根据产品数量来确定。
标签: sql sql-server-2008 tsql