【问题标题】:Pivoting a table in sql在sql中透视表
【发布时间】:2017-10-14 17:58:23
【问题描述】:

I want same output shown in Output table. I have TableA and I want to pivote it and want output table as shown in image. Thanks

我有一张桌子#tableA

+-----+-------------+-------+------------+
|  A  | Allocations | Seats |  EndDate   |
+-----+-------------+-------+------------+
| ABC |         450 |    23 | 2017-10-05 |
| ABC |          23 |   765 | 2017-05-01 |
| PQR |          54 |    34 | 2017-07-04 |
| ABC |         234 |    45 | 2017-11-27 |
| PQR |         987 |    76 | 2017-03-05 |
| ABC |          76 |    65 | 2017-02-23 |
| PQR |          89 |   324 | 2017-08-14 |
| ABC |          45 |    34 | 2017-07-13 |
+-----+-------------+-------+------------+

可以如下创建和填充。

CREATE TABLE #TableA
  (
     A           VARCHAR(50),
     Allocations INT,
     Seats       INT,
     EndDate     DATETIME
  );

INSERT INTO #TableA
VALUES     ('ABC',450,23,'2017-10-05'),
           ('ABC',23,765,'2017-05-01'),
           ('PQR',54,34,'2017-07-04'),
           ('ABC',234,45,'2017-11-27'),
           ('PQR',987,76,'2017-03-05'),
           ('ABC',76,65,'2017-02-23'),
           ('PQR',89,324,'2017-08-14'),
           ('ABC',45,34,'2017-07-13'); 

A 列具有 ABCPQR 唯一值。 日期时间列有多个值。

我怎样才能得到以下输出?

Datetime 列中 TableA 中的所有日期时间值。

  Output    :-

    date         |  2017-12-13   |  2017-12-20  |   2017-12-27 | -|-|-|-|-|-|-|-|-|
    ------------------------------------------------------------------------------- 
    A            |  ABC          |  ABC         |   ABC        |
    Allocations  |  50           |  50          |   50         |
    Seats        |  27           |  27          |   27         |
    A            |  PQR          |  PQR         |   PQR        |
    Alloc        |  50           |  50          |   50         |
    Seats        |  12           |  12          |   12         |

【问题讨论】:

  • 点击问题查看图片。
  • 嘿,谢谢.. 我会这样做的
  • 期望的输出与示例输入有何关联?为什么每天都有50/27/50/12
  • 它可以是除 50/27/50/12 以外的任何数字。我错误地复制粘贴在那里。我刚刚展示了输出表作为参考。 TableA 中的一列有两个唯一条目 PQR 和 ABC。 Allocation 和 Seats 是值的总和。

标签: sql sql-server sql-server-2008 sql-server-2008-r2 sql-server-2014


【解决方案1】:

这是您应该在报告层而不是 SQL 中执行的操作。

这在 SQL (demo) 中是可能的,但不是 SQL 旨在做的事情。

WITH T
     AS (SELECT A,
                thing,
                priority,
                value,
                d
         FROM   #TableA
                CROSS APPLY (VALUES(CAST(EndDate AS DATE)))D(d)
                CROSS APPLY (VALUES(1, 'A', NULL),
                                   (2, 'Allocations', Allocations),
                                   (3, 'Seats', Seats)) V(priority, thing, value))
SELECT thing, 
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-02-23],0) AS VARCHAR(50)) END AS [2017-02-23],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-03-05],0) AS VARCHAR(50)) END AS [2017-03-05],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-05-01],0) AS VARCHAR(50)) END AS [2017-05-01],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-07-04],0) AS VARCHAR(50)) END AS [2017-07-04],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-07-13],0) AS VARCHAR(50)) END AS [2017-07-13],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-08-14],0) AS VARCHAR(50)) END AS [2017-08-14],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-10-05],0) AS VARCHAR(50)) END AS [2017-10-05],
case when thing = 'A' THEN A ELSE CAST(ISNULL([2017-11-27],0) AS VARCHAR(50)) END AS [2017-11-27]
FROM T
PIVOT (SUM(value) FOR d in (
                            [2017-02-23],
                            [2017-03-05],
                            [2017-05-01],
                            [2017-07-04],
                            [2017-07-13],
                            [2017-08-14],
                            [2017-10-05],
                            [2017-11-27])) P
ORDER BY A, priority

以上内容甚至没有解决动态方面。为此,您需要根据上述内容和 #TableA 中的日期生成动态 SQL 字符串

【讨论】:

  • 嘿,非常感谢。我已经为日期生成了动态 SQL 字符串。如何在上面的查询中使用它?非常感谢..
  • 你需要将整个东西连接成一个字符串并exec它。
  • 嘿,我在生成动态 SQL 字符串时遇到问题。你能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 2012-11-09
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
相关资源
最近更新 更多