Sql 按计数列筛选
产品组Sql 按计数列筛选,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,产品组 ProductGroupID Description 301 Shampoo 302 Soap 303 Brush 产品 ProductID ProductGroupID Desc Price 4001 301 Shampoo1 2 4002 301 Shampoo2 3 40
ProductGroupID Description
301 Shampoo
302 Soap
303 Brush
产品
ProductID ProductGroupID Desc Price
4001 301 Shampoo1 2
4002 301 Shampoo2 3
4003 301 Shampoo3 4
4004 302 Soap1 2
4005 302 Soap2 3
4006 302 Soap3 5
4007 303 Brush1 6
4008 303 Brush2 7
4009 303 Brush3 8
命令
不过滤
Select p.ProductID, p.Desc, pg.ProductGroupID, pg.Description Count(o.ProductID) as OrderNum, p.Price
From Order o
inner join Product p
ON o.ProductID = p.ProductID
inner join ProductGroup pg
ON p.ProductGroupID = pg.ProductGroupID
Group By p.ProductID, p.Desc, pg.ProductGroupID, pg.Description, p.Price with Cube
Having ProductGroupID is not null
ProductID Desc ProductGroupID Description OrderNum Price
4001 Shampoo1 301 Shampoo 2 2
4002 Shampoo2 301 Shampoo 3 3
4003 Shampoo3 301 Shampoo 2 4
-------- -------- 301 Shampoo 7 ----
4004 Soap1 302 Soap 0 2
4005 Soap2 302 Soap 1 3
4006 Soap3 302 Soap 0 5
-------- -------- 302 Brush 1 ----
4007 Brush1 303 Brush 1 6
4008 Brush2 303 Brush 1 7
4009 Brush3 303 Brush 2 8
-------- -------- 303 Brush 4 ----
在小计中进行过滤
Select p.ProductID, p.Desc, pg.ProductGroupID, pg.Description Count(o.ProductID) as OrderNum, p.Price
From Order o
inner join Product p
ON o.ProductID = p.ProductID
inner join ProductGroup pg
ON p.ProductGroupID = pg.ProductGroupID
Group By p.ProductID, p.Desc, pg.ProductGroupID, pg.Description, p.Price with Cube
Having ProductGroupID is not null
AND SubTotal(OrderNum) => 4 -- not working
ProductID Desc ProductGroupID Description OrderNum Price
4001 Shampoo1 301 Shampoo 2 2
4002 Shampoo2 301 Shampoo 3 3
4003 Shampoo3 301 Shampoo 2 4
-------- -------- 301 Shampoo 7 ----
4007 Brush1 303 Brush 1 6
4008 Brush2 303 Brush 1 7
4009 Brush3 303 Brush 2 8
-------- -------- 303 Brush 4 ----
如何使用它们的小计进行筛选?看起来您正在尝试筛选聚合值。 1.使用
HAVING
代替最后一个WHERE
子句:
Select p.ProductID, p.Desc, pg.ProductGroupID, pg.Description Count(o.ProductID) as OrderNum, p.Price
From Order o
inner join Product p
ON o.ProductID = p.ProductID
inner join ProductGroup pg
ON p.ProductGroupID = pg.ProductGroupID
Group By p.ProductID, p.Desc, pg.ProductGroupID, pg.Description, p.Price
HAVING COUNT(OrderNum) => 4
因为这是针对SQL 2008 R2的,所以您可以将与多维数据集一起使用
来获取小计:
Select
p.ProductID,
p.[Desc],
pg.ProductGroupID,
pg.Description,
Count(o.ProductID) as OrderNum,
p.Price
From
Order o
inner join Product p ON o.ProductID = p.ProductID
inner join ProductGroup pg ON p.ProductGroupID = pg.ProductGroupID
Group By
p.ProductID,
p.[Desc],
pg.ProductGroupID,
pg.Description,
p.Price
with cube
要根据某个筛选器值获取特定节,可以执行以下操作:
SELECT *
FROM
(
Select
p.ProductID,
--p.[Desc],
--pg.ProductGroupID,
pg.Description,
Count(o.ProductID) as OrderNum,
p.Price
From
Order o
inner join Product p ON o.ProductID = p.ProductID
inner join ProductGroup pg ON p.ProductGroupID = pg.ProductGroupID
Group By
p.ProductID,
--p.[Desc],
--pg.ProductGroupID,
pg.Description,
p.Price
with cube
) subTotals
inner join
(
SELECT Count(o.ProductID) as OrderNum, pg.Description
FROM
Order o
inner join Product p ON o.ProductID = p.ProductID
inner join ProductGroup pg ON p.ProductGroupID = pg.ProductGroupID
GROUP BY pg.Description
HAVING Count(o.ProductID) >= 4
) groupFilter on groupFilter.Description = subTotals.description
where Price IS NULL
看起来您正在尝试筛选聚合值。 1.使用
HAVING
代替最后一个WHERE
子句:
Select p.ProductID, p.Desc, pg.ProductGroupID, pg.Description Count(o.ProductID) as OrderNum, p.Price
From Order o
inner join Product p
ON o.ProductID = p.ProductID
inner join ProductGroup pg
ON p.ProductGroupID = pg.ProductGroupID
Group By p.ProductID, p.Desc, pg.ProductGroupID, pg.Description, p.Price
HAVING COUNT(OrderNum) => 4
因为这是针对SQL 2008 R2的,所以您可以将与多维数据集一起使用
来获取小计:
Select
p.ProductID,
p.[Desc],
pg.ProductGroupID,
pg.Description,
Count(o.ProductID) as OrderNum,
p.Price
From
Order o
inner join Product p ON o.ProductID = p.ProductID
inner join ProductGroup pg ON p.ProductGroupID = pg.ProductGroupID
Group By
p.ProductID,
p.[Desc],
pg.ProductGroupID,
pg.Description,
p.Price
with cube
要根据某个筛选器值获取特定节,可以执行以下操作:
SELECT *
FROM
(
Select
p.ProductID,
--p.[Desc],
--pg.ProductGroupID,
pg.Description,
Count(o.ProductID) as OrderNum,
p.Price
From
Order o
inner join Product p ON o.ProductID = p.ProductID
inner join ProductGroup pg ON p.ProductGroupID = pg.ProductGroupID
Group By
p.ProductID,
--p.[Desc],
--pg.ProductGroupID,
pg.Description,
p.Price
with cube
) subTotals
inner join
(
SELECT Count(o.ProductID) as OrderNum, pg.Description
FROM
Order o
inner join Product p ON o.ProductID = p.ProductID
inner join ProductGroup pg ON p.ProductGroupID = pg.ProductGroupID
GROUP BY pg.Description
HAVING Count(o.ProductID) >= 4
) groupFilter on groupFilter.Description = subTotals.description
where Price IS NULL
根据需要的小计,可以使用
汇总
或多维数据集
运算符
汇总将为您提供分类汇总的层次结构。(我假设ProductID
和Desc
具有1:1的匹配,因此我在汇总中将它们连接在一起,组ID和描述也是如此)。我还假设您可能希望将产品分组到产品组中
GROUP BY ROLLUP((pg.ProductGroupID, pg.Description), (p.ProductID, p.Desc), p.Price)
或者可以使用多维数据集操作符获取所有可能的总计和小计
GROUP BY p.ProductID, p.Desc, pg.ProductGroupID, pg.Description, p.Price WITH CUBE
您还可以使用GROUP BY GROUPING set(…
)手动指定所需的所有分组
还有更多示例。根据需要的小计,您可以使用
汇总
或多维数据集
运算符
汇总将为您提供一个分类汇总的层次结构。(我假设ProductID
和Desc
具有1:1的匹配,因此我在汇总中连接了它们,组ID和描述也是如此)。我还假设您可能希望在产品组中对产品进行分组
GROUP BY ROLLUP((pg.ProductGroupID, pg.Description), (p.ProductID, p.Desc), p.Price)
或者可以使用多维数据集操作符获取所有可能的总计和小计
GROUP BY p.ProductID, p.Desc, pg.ProductGroupID, pg.Description, p.Price WITH CUBE
您还可以使用GROUP BY GROUPING set(…
)手动指定所需的所有分组
还有更多的例子。使用“无过滤”的代码有输入错误:“Soap”的小计在“描述”列中有“画笔”。多维数据集和汇总都可以,但我更喜欢分组集,因为它们允许精确配置。汇总和汇总只使用引擎盖下的代码。使用“无过滤”的代码有输入错误:Soap小计有“Brush”在“描述”列中。多维数据集和多维数据集都可以,但我更喜欢分组集,因为它们允许精确配置。多维数据集和多维数据集只使用引擎盖下的集合。感谢多维数据集的
。仍然存在筛选问题。您感兴趣的是什么?只有小计?还是小计较大的整个数据段某个值?小计大于某个值的整个段。它给出了正确的结果(),但当我在“选择”中添加其他列时,结果是错误的()当您向group by添加更多的列时,您会添加更多的小计部分,这就是为什么您会看到额外的行,如果您不想看到这些行,只需过滤掉空价格。感谢使用多维数据集。仍然存在筛选问题您感兴趣的是什么?只有小计?还是小计大于s的整个部分ome value?小计大于某个值的整个段。它给出了正确的结果(),但当我在select中添加其他列时,结果是错误的()当您向group by添加更多的列时,您会添加更多的小计部分,这就是为什么您会看到额外的行,如果您不想看到这些行,只需过滤掉空的价格。使用它们的小计进行过滤如何?您必须与生成小计的另一个查询交叉连接,就像mrtig一样。having
子句本身只会重新执行rn小计行。如何使用它们的小计进行过滤?您必须与生成小计的另一个查询交叉连接,就像mrtig所做的那样。having
子句本身只会返回小计行。