【问题标题】:Count all rows from a colum, and get 2 different count columns on the result (One for each possible value 1 or 0)计算一列中的所有行,并在结果中获得 2 个不同的计数列(每个可能值 1 或 0 一个)
【发布时间】:2014-12-09 03:44:48
【问题描述】:

感谢您抽出宝贵时间阅读我的问题。

我想要做的是计算列(状态)中的所有行,并在结果中获得 2 个不同的计数列(每个可能值 1 或 0 一个)。

例如,我有一个包含这些行的表(称为“产品”):

  ProductID |Subcategory| State |
    101     |   201     |   1   |
    102     |   201     |   1   |
    103     |   201     |   1   |
    104     |   202     |   0   |
    105     |   202     |   0   |
    106     |   203     |   1   |
    107     |   203     |   0   |
    108     |   203     |   0   |

状态:1=活动,0=非活动

所以我想得到这个:

|Subcategory| Active|Inactive|
|   201     |   3   |   0    |
|   202     |   0   |   2    |
|   202     |   1   |   2    |

你知道我该怎么做吗?

我正在尝试使用此查询并将结果插入到一个临时表中:

SELECT product.Subcategory, 
COUNT(product.Subcategory) AS Products
FROM product,subcategory,category
WHERE product.Subcategory = subcategory.SubcategoryId
AND product.State = 1 or 0
AND subcategory.Category = category.CategoryId
GROUP BY product.Subcategory

但我只得到状态 = 1 或 0 的产品

我尝试了 LEFT JOIN,但无法获得所需的内容。

这就是我正在尝试的……(但它不起作用)

SELECT P.Subcategory, 
        COUNT(P.State)
FROM product AS P
LEFT JOIN(
SELECT product.Subcategory AS S, 
        COUNT(product.State) AS C
FROM product
WHERE product.State = 0
GROUP BY product.Subcategory) AS t
ON t.S = p.Subcategory

我发誓我检查了其他用户问题,例如:

Display zero by using count(*) if no result returned for a particular case

SQL - Returning all rows even if count is zero for item

但我找不到我需要的东西。

你能帮我解决这个问题吗? =)

谢谢!!!

【问题讨论】:

    标签: sql-server sql-server-2008 count


    【解决方案1】:

    我会使用条件聚合来做到这一点:

    select p.subcategory,
           sum(case when state = 1 then 1 else 0 end) as active,
           sum(case when state = 0 then 1 else 0 end) as inactive
    from product p
    group by p.subcategory
    

    【讨论】:

    • 轰隆隆!有史以来最快的答案!非常感谢!我只是在这上面花了几个小时......感谢上帝,我们有像你这样的人! :) @GordonLinoff
    • 这里也可以避免其他情况(状态 = 1 然后 1 结束的情况)为活动
    • @BharatBhushanSharma 。 . .删除else 有返回NULL 的风险。
    • 它可以使用 isnull() 来管理,例如 sum(case when isnull(state,0) = 1 then 1 end)
    【解决方案2】:

    您可以通过两种方式做到这一点。

    一种是通过使用Conditional Aggregate 使用Count 而不是Sum 来避免Elsecase statement 中的一部分

    SELECT subcategory,
           Count(CASE WHEN state = 1 THEN 1 END) AS Active,
           Count(CASE WHEN state = 0 THEN 1 END) AS InActive
    FROM   product 
    GROUP  BY subcategory
    

    另一种方法是使用Pivot

    SELECT subcategory,
           [1] AS Active,
           [0] AS InActive
    FROM   (SELECT subcategory,
                   State,
                   ProductID
            FROM   product) a
           PIVOT(Count(ProductID)
                FOR State IN([1],[0])) piv 
    

    【讨论】:

    • 谢谢你!我不知道 PIVOT 存在...非常感谢! @NoDisplayName
    【解决方案3】:

    试试这个

    SELECT subcategory,
             Count(State) AS TotalC,
             ABS(Sum(State)) AS Active,
             TotalC-Active AS InActive
    FROM product GROUP BY ProductID;
    

    【讨论】:

    • 你为什么添加你的电子邮件?系统将您的回答视为垃圾邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多