SQL 转置字符串/多个未转置的列
SQL Pivot Strings / Multiple Unpivoted Columns
SQL 的新手,需要一些帮助 "pivoting" table。这就是我想要做的...
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 ║ ║
╚═════════════╩══════════╩═════════╩═════════╩═════════╝
回答潜在问题:
- 输出应该只列出唯一的销售日期。
- 我不想调整所有商店,例如我不需要拉 Sketchers 的行。
Stack Overflow 的新手,所以如果我能澄清任何问题,请告诉我。谢谢!
我想你只需要一个标准的数据透视表查询:
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];
只要在 select 子句中没有术语来透视该数据即可满足不包括 Sketchers 数据的要求。
请注意,您没有告诉我们您使用的是哪个数据库。我假设 SQL 服务器,其中可以使用方括号转义带有空格的列名。在其他数据库中,您需要通过其他方式转义。
SQL 的新手,需要一些帮助 "pivoting" table。这就是我想要做的...
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 ║ ║
╚═════════════╩══════════╩═════════╩═════════╩═════════╝
回答潜在问题:
- 输出应该只列出唯一的销售日期。
- 我不想调整所有商店,例如我不需要拉 Sketchers 的行。
Stack Overflow 的新手,所以如果我能澄清任何问题,请告诉我。谢谢!
我想你只需要一个标准的数据透视表查询:
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];
只要在 select 子句中没有术语来透视该数据即可满足不包括 Sketchers 数据的要求。
请注意,您没有告诉我们您使用的是哪个数据库。我假设 SQL 服务器,其中可以使用方括号转义带有空格的列名。在其他数据库中,您需要通过其他方式转义。