SQL 服务器 - 动态多列数据透视表
SQL Server - Dynamic multi column pivot
我有这样的结果,Annual
是动态的,可能有 X 个范围
+-----------+---------+-----------+
| Annual | Revenue | Completed |
+-----------+---------+-----------+
| 2020/2021 | 1000 | Yes |
+-----------+---------+-----------+
| 2021/2022 | 2000 | Yes |
+-----------+---------+-----------+
| 2022/2023 | 2500 | No |
+-----------+---------+-----------+
我希望得到这样的结果:
+-----------+-----------+-----------+-----------+
| Annual | 2020/2021 | 2021/2022 | 2022/2023 |
+-----------+-----------+-----------+-----------+
| Revenue | 1000 | 2000 | 2500 |
+-----------+-----------+-----------+-----------+
| Completed | Yes | Yes | No |
+-----------+-----------+-----------+-----------+
这是我目前得到的结果,我可以在我的本地执行但似乎无法让它在 sqlfiddle 上执行:
http://sqlfiddle.com/#!18/a4c61/4
我查看了整个 Whosebug 的例子,但似乎找不到像我这样的确切案例。
如果可以请帮忙,谢谢!
Sql version: Microsoft SQL Azure (RTM) - 12.0.2000.8 May 15 2020 00:47:08
动态数据推荐
您可以获取计数并使用 StringBuilder
生成 strSQL
。
StringBuilder strSQL = new StringBuilder();
int DataAmount = 3;// a,b,c,d,e
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(0 ,"a");
dic.Add(1, "b");
dic.Add(2, "c");
strSQL.Append("select ");
strSQL.Append(" isnull(a.Column2,b.Column2) Column0,isnull(a.Column1,0) Column1 ");
//dic.Count > 2
for (int i = 1; i < dic.Count; i++)
{
strSQL.Append(",isnull("+dic[i]+".Column1,0) Column"+i+" ");
}
strSQL.Append(" from (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=1) a ");
for (int j = 1; j < dic.Count; j++)
{
strSQL.Append("FULL JOIN (SELECT ID, Column1, Column2 FROM[dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed])) " + dic[j] + " where ID = " + (j+1)+ ") " + dic[j] + " on a.Column2 = " + dic[j]+".Column2 ");
}
// SqlHelper.ExcuteNoQuery(strSQL.ToString());
SQL查询部分
我的 azure sqlserver 中的数据。
当运行 SELECT *FROM [dbo].[20200618]
.
运行 SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=2
.
最后,运行 代码。
select isnull(a.Column2,b.Column2) Column0,isnull(a.Column1,0) Column1,isnull(b.Column1,0) Column2,isnull(c.Column1,0) Column3 from (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=1) a FULL JOIN (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=2) b on a.Column2=b.Column2 FULL JOIN (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=3) c on a.Column2=c.Column2
我有这样的结果,Annual
是动态的,可能有 X 个范围
+-----------+---------+-----------+
| Annual | Revenue | Completed |
+-----------+---------+-----------+
| 2020/2021 | 1000 | Yes |
+-----------+---------+-----------+
| 2021/2022 | 2000 | Yes |
+-----------+---------+-----------+
| 2022/2023 | 2500 | No |
+-----------+---------+-----------+
我希望得到这样的结果:
+-----------+-----------+-----------+-----------+
| Annual | 2020/2021 | 2021/2022 | 2022/2023 |
+-----------+-----------+-----------+-----------+
| Revenue | 1000 | 2000 | 2500 |
+-----------+-----------+-----------+-----------+
| Completed | Yes | Yes | No |
+-----------+-----------+-----------+-----------+
这是我目前得到的结果,我可以在我的本地执行但似乎无法让它在 sqlfiddle 上执行: http://sqlfiddle.com/#!18/a4c61/4
我查看了整个 Whosebug 的例子,但似乎找不到像我这样的确切案例。
如果可以请帮忙,谢谢!
Sql version: Microsoft SQL Azure (RTM) - 12.0.2000.8 May 15 2020 00:47:08
动态数据推荐
您可以获取计数并使用 StringBuilder
生成 strSQL
。
StringBuilder strSQL = new StringBuilder();
int DataAmount = 3;// a,b,c,d,e
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(0 ,"a");
dic.Add(1, "b");
dic.Add(2, "c");
strSQL.Append("select ");
strSQL.Append(" isnull(a.Column2,b.Column2) Column0,isnull(a.Column1,0) Column1 ");
//dic.Count > 2
for (int i = 1; i < dic.Count; i++)
{
strSQL.Append(",isnull("+dic[i]+".Column1,0) Column"+i+" ");
}
strSQL.Append(" from (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=1) a ");
for (int j = 1; j < dic.Count; j++)
{
strSQL.Append("FULL JOIN (SELECT ID, Column1, Column2 FROM[dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed])) " + dic[j] + " where ID = " + (j+1)+ ") " + dic[j] + " on a.Column2 = " + dic[j]+".Column2 ");
}
// SqlHelper.ExcuteNoQuery(strSQL.ToString());
SQL查询部分
我的 azure sqlserver 中的数据。
当运行 SELECT *FROM [dbo].[20200618]
.
运行 SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=2
.
最后,运行 代码。
select isnull(a.Column2,b.Column2) Column0,isnull(a.Column1,0) Column1,isnull(b.Column1,0) Column2,isnull(c.Column1,0) Column3 from (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=1) a FULL JOIN (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=2) b on a.Column2=b.Column2 FULL JOIN (SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=3) c on a.Column2=c.Column2