首页 > 解决方案 > SQL 透视字符串/多个非透视列

问题描述

SQL 新手,需要一些帮助“透视”表。这就是我想要做的......

Oracle 数据库格式:

╔═════════════╦══════════╦═══════════╦═══════════╗
║ Sale Start  ║ Sale End ║   Store   ║ Promotion ║
╠═════════════╬══════════╬═══════════╬═══════════╣
║ 1/1         ║ 4/1      ║ Nike      ║ 10% OFF   ║
║ 1/1         ║ 4/1      ║ Adidas    ║ 20% OFF   ║
║ 1/1         ║ 6/1      ║ Reebok    ║ 30% OFF   ║
║ 2/1         ║ 4/1      ║ Nike      ║ 40% OFF   ║
║ 2/1         ║ 4/1      ║ Reebok    ║ 50% OFF   ║
║ 3/1         ║ 4/1      ║ Adidas    ║ 60% OFF   ║
║ 3/1         ║ 4/1      ║ Sketchers ║ 70% OFF   ║
╚═════════════╩══════════╩═══════════╩═══════════╝

期望的输出:

╔═════════════╦══════════╦═════════╦═════════╦═════════╗
║ Sale Start  ║ Sale End ║  Nike   ║ Adidas  ║ Reebok  ║
╠═════════════╬══════════╬═════════╬═════════╬═════════╣
║ 1/1         ║ 4/1      ║ 10% OFF ║ 20% OFF ║         ║
║ 1/1         ║ 6/1      ║         ║         ║ 30% OFF ║
║ 2/1         ║ 4/1      ║ 40% OFF ║         ║ 50% OFF ║
║ 3/1         ║ 4/1      ║         ║ 60% OFF ║         ║
╚═════════════╩══════════╩═════════╩═════════╩═════════╝

要回答潜在问题:

Stack Overflow 的新手,所以如果我能澄清任何事情,请告诉我。谢谢!

标签: sqldatabaseteradata

解决方案


我认为您只需要一个标准的数据透视查询:

SELECT
    [Sale Start],
    [Sale End],
    MAX(CASE WHEN Store = 'Nike'   THEN Promotion END) AS Nike,
    MAX(CASE WHEN Store = 'Adidas' THEN Promotion END) AS Adidas,
    MAX(CASE WHEN Store = 'Reebok' THEN Promotion END) AS Reebok
FROM yourTable
WHERE Store IN ('Nike', 'Adidas', 'Reebok')
GROUP BY
    [Sale Start],
    [Sale End];

不包括 Sketchers 数据的要求是通过在 select 子句中没有一个术语来旋转该数据来满足的。

请注意,您没有告诉我们您使用的是哪个数据库。我假设 SQL Server 可以使用方括号对带有空格的列名进行转义。在其他数据库中,您需要以其他方式进行转义。


推荐阅读