首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按具有相同层次结构的不同成员的多个列分组?

按具有相同层次结构的不同成员的多个列分组?
EN

Database Administration用户
提问于 2016-06-27 04:16:03
回答 2查看 2.6K关注 0票数 4

我在这样的表结构中有客户数据:

代码语言:javascript
复制
customerID | productLine1 | productLine2 | productLine3
1          | 1            | null         | null
2          | 2            | 1            | null
3          | 4            | 2            | 1

每个客户被分配到至少一条生产线,但最多有三条生产线。

现在我想看看每条生产线我有多少客户。对如何解决这个问题有什么想法吗?

重要事项:我不希望将列转换为行(这将是一个解决方案)。因此,结果将是:

代码语言:javascript
复制
productLine "1" --> 3 customers
productLine "2" --> 2 customers
productLine "4" --> 1 customer
EN

回答 2

Database Administration用户

回答已采纳

发布于 2016-06-27 05:59:15

尝试以下操作(用您的表名替换tbl ):

代码语言:javascript
复制
WITH Unpivoted
AS (
    SELECT customerID
        ,ProductLineSlot
        ,ProductLine
    FROM (
        SELECT customerID
            ,productLine1
            ,productLine2
            ,productLine3
        FROM tbl
        ) p
    unpivot(ProductLine FOR ProductLineSlot IN (
                productLine1
                ,productLine2
                ,productLine3
                )) AS unpvt
    )
SELECT ProductLine
    ,count(*) AS [Number Of Customers]
FROM Unpivoted
GROUP BY ProductLine;

或者您可以在不使用CTE或派生表的情况下重写:

代码语言:javascript
复制
SELECT
    ProductLine,
    COUNT(*) AS [Number Of Customers]
FROM
    tbl AS t
    UNPIVOT
    (
      ProductLine
      FOR ProductLineSlot IN (productLine1, productLine2, productLine3)
    ) AS u
GROUP BY
    ProductLine
;

为了详细说明查询的工作方式,UNPIVOT子句将表转换为如下所示的行集:

代码语言:javascript
复制
customerID  ProductLineSlot  ProductLine
----------  ---------------  -----------
1           productLine1     1
2           productLine1     2
2           productLine2     1
3           productLine1     4
3           productLine2     2
3           productLine3     1

UNPIVOT自动省略ProductLine为null的行。您可以看到,上面的行集可以由ProductLine分组,以获得最终结果的每个组的行数:

代码语言:javascript
复制
ProductLine  Number Of Customers
-----------  -------------------
1            3
2            2
4            1

这就是查询所做的。

票数 1
EN

Database Administration用户

发布于 2016-06-27 19:56:49

因为COUNT消除了空值,所以可以在每一列上使用COUNT

代码语言:javascript
复制
SELECT COUNT([productLine1]) AS [productLine1]
     , COUNT([productLine2]) AS [productLine2]
     , COUNT([productLine3]) AS [productLine3]
FROM tbl

你会收到警告的,这是预期的。如果您想避免这种情况,可以使用SUM使用一个CASE声明代替COUNT

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/142312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档