【问题标题】:Getting the counts of the number of months a user has been using a particular service in SQL获取用户在 SQL 中使用特定服务的月数
【发布时间】:2017-12-20 14:24:25
【问题描述】:

我有如下数据:

user_id month_id    service
895       201612    S
262       201612    V
5300      201612    BB

现在可能会有用户在一年内使用过一项以上的服务,我希望有一个查询可以提供给我。比如 895 用了 S 3 个月,BB 用了 4 个月,那么他最近的服务是 V。所以:

user_id S BB V
895     3 4  5

我如何在 SQL 中执行此数据透视和计数,有人可以帮我吗?

【问题讨论】:

  • 你的数据库是什么?不同的数据库有不同的语法。这也是 sql 主题中回答最多的问题之一。搜索数据透视表或将行转置为列
  • 这是红移@JorgeCampos。是的,我知道这是一个常见的查询,但我找不到任何符合我要求的内容。
  • 您不需要完全相同的数据或要求。这是关于查询的结构。会是一样的
  • S、BB 和 V 是唯一可能的服务吗?通常,pivot 要求您明确指出要旋转的列。
  • 你好@justiceorjustus,可以有大约200个服务,对于用户没有使用的条目将为零。

标签: sql pivot data-munging


【解决方案1】:

以下是动态执行的方法:

DECLARE @Cols AS NVARCHAR(MAX)
    ,@Query AS NVARCHAR(MAX);

SET @Cols = STUFF((
            SELECT DISTINCT ',' + QUOTENAME(service)
            FROM YourTable
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @Query = 'SELECT user_id, ' + @Cols + ' from 
            (
                select user_id
                    , month_id
                    , service
                from YourTable
           ) x
            pivot 
            (
                 COUNT(month_id)
                for service in (' + @Cols + ')
            ) p '

EXECUTE(@Query)

编辑:没有意识到这是month_idCOUNT 而不是DATEDIFF(mm, CONVERT(DATETIME, month_id + ''01'',GETDATE())。已更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2021-12-11
    • 1970-01-01
    • 2013-05-29
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多