【问题标题】:Dynamic Sql Pivot Two Columns of Table动态 Sql Pivot 表的两列
【发布时间】:2018-06-26 02:10:21
【问题描述】:

使用动态数据透视表,我正在尝试获取此表:http://www.sqlfiddle.com/#!18/9f1cf/47

看起来像这样:(为简洁起见删除了一些列,假设我可以有一个或多个列通过“Chosen Council”,这只是预期的设计而不是预期的结果)

请注意,邮政编码可以为空,可以共享委员会,并且可以在几天内重复

+============+=======+================+============================+====================================+=========================+=====================+
| Call Date  |  Zip  | Chosen Council | Early Childhood Group Care | Development / Developmental Delays | Caregiver Mental Health | Behavioral Concerns |
+============+=======+================+============================+====================================+=========================+=====================+
| 2018-05-01 | 85000 | Maricopa North | null                       | 1                                  | 2                       | null                |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+
| 2018-05-01 | 85001 | Maricopa North | 1                          | null                               | null                    | null                |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+
| 2018-05-01 | null  | null           | null                       | 2                                  | null                    | null                |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+
| 2018-05-02 | 85000 | Maricopa North | null                       | 1                                  | 1                       | 3                   |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+
| 2018-05-02 | 85003 | Phoenix South  | null                       | null                               | null                    | 2                   |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+
| 2018-05-02 | 85004 | Phoenix South  | 1                          | 2                                  | null                    | 2                   |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+
| 2018-05-02 | null  | null           | null                       | 1                                  | 1                       | null                |
+------------+-------+----------------+----------------------------+------------------------------------+-------------------------+---------------------+

我看到了很多关于数据透视表的问题,包括硬编码的和动态的,但我仍然没有掌握它。

在这里,我能够获得仅包含呼叫主题名称及其计数的动态数据透视表:http://www.sqlfiddle.com/#!18/9f1cf/39
但这只是所有内容的单行,它似乎也忽略了空值。

在这里,我尝试扩展上述内容,虽然看起来间隔更好,但我还没有弄清楚如何附加我的通话日期、邮编或选定的委员会列:http://www.sqlfiddle.com/#!18/9f1cf/37

有什么想法可以做到这一点吗?


ASCII 表的制作:用https://ozh.github.io/ascii-tables/制作

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    也许你需要像下面这样的东西

    DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
    SET @columns = N'';
    SELECT @columns += N', _callTopics.' + QUOTENAME(Name)
      FROM
      (
        SELECT
          _callTopics.Name
        FROM CallTopics AS _callTopics
        INNER JOIN CallTopicsPerRegion AS _callTopicsPerRegion
            ON _callTopics.Name = _callTopicsPerRegion.CallTopicName
        GROUP BY _callTopics.Name
      ) AS x;
    SET @sql = N'
      SELECT CallDate
      ,Zip
      ,ChosenCouncil, ' + STUFF(@columns, 1, 2, '') + '
      FROM
      (
        SELECT _callTopics.Name, _callTopicsPerRegion.CallTopicCount,
        CallDate
      ,Zip
      ,ChosenCouncil
        FROM CallTopics AS _callTopics
        INNER JOIN CallTopicsPerRegion AS _callTopicsPerRegion
        ON _callTopics.Name = _callTopicsPerRegion.CallTopicName
      ) AS j
      PIVOT
      (
        SUM(CallTopicCount) FOR Name IN ('
        + STUFF(REPLACE(@columns, ', _callTopics.[', ',['), 1, 1, '')
        + ')
      ) AS _callTopics order by 1,2 ,3';
    --PRINT @sql;
    EXEC sp_executesql @sql;
    

    这里是 fiddle link

    【讨论】:

    • 做到了!谢谢!将我的脚本与您的脚本进行比较,看起来我只是在' + STUFF(@columns, 1, 2, '') + ' 之前的 SELECT 语句中缺少 CallDetail、Zip 和 ChosenCouncil
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多