Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按计数列筛选_Sql_Tsql_Sql Server 2008 R2 - Fatal编程技术网

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
子句本身只会返回小计行。