【发布时间】:2016-01-07 10:18:56
【问题描述】:
表格:产品
create table Product
(
productID int,
productName varchar(20),
productsalesdate DATETIME,
producttype varchar(20)
);
插入:
insert into product values(1,'PenDrive','2010-01-01','Electronic');
insert into product values(1,'Computer','2016-01-01','Electronic');
insert into product values(1,'Laptop','2011-02-02','Electronic');
insert into product values(2,'textbook','2014-02-02','books');
insert into product values(2,'notebook','2016-01-01','books');
insert into product values(3,'Car','2016-01-01','Vehicle');
insert into product values(3,'Bike','2016-01-07','Vehicle');
第一次尝试:在这里我弄错了 productType 的总和
SELECT productID, FirstSale,LastSale, [Electronic],[books],[Vehicle]
FROM
(
SELECT
productID,
MIN(ProductSalesdate) as FirstSale,
MAX(ProductSalesdate) as LastSale,
productType
FROM
Product
Group by productID,productType
) a
PIVOT
(
COUNT(productType)
FOR productType IN ( [Electronic],[books],[Vehicle] )
) AS pvt;
第二次尝试:在这次尝试中,我解决了求和问题,但查询需要更多时间来执行大量记录。
SELECT productID,FirstSale,LastSale ,[Electronic],[books],[Vehicle]
FROM
(
SELECT a.ProductID, a.FirstSale, a.LastSale, b.ProductType
FROM Product b
inner join
(
SELECT
productID,
MIN(ProductSalesdate) as FirstSale,
MAX(ProductSalesdate) as LastSale
FROM
Product
Group by productID
) as a
ON a.ProductID = b.ProductID
) ab
PIVOT
(
COUNT(productType)
FOR productType IN ( [Electronic],[books],[Vehicle] )
) AS pvt;
注意:第二个查询工作正常,但问题在于性能,因为 我要加入两个相同的表,因为要在数据透视查询中获取 productType 的计数。
问题:如何优化我第二次尝试的第二次查询?
【问题讨论】:
-
某个
productType的产品可以有相同的productId吗? -
此外,您在第二次尝试中有一个派生表
a,它在productType, productId上分组,但您仅在productId上与b一起加入它......看起来很可疑 -
您声称您的性能有问题。你能描述一下吗?需要几秒钟、几分钟、几小时?您预计执行时间是多少?
-
另外,你在
Product桌子上有合适的INDEXes吗? -
@TT,对于 15k 条记录,这似乎需要 10 分钟,是的,我在
productID上有index。
标签: sql sql-server sql-server-2008-r2 pivot