SQL Сервер - Dynami c многоколоночная сводка - PullRequest
2 голосов
/ 17 июня 2020

У меня есть такие результаты, Annual это динамическое c и может иметь 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

Я просмотрел примеры во всем stackoverflow, но, похоже, не нашел точного случая, подобного моему.

Пожалуйста, помогите, если можете, спасибо!

Sql version: Microsoft SQL Azure (RTM) - 12.0.2000.8   May 15 2020 00:47:08  

1 Ответ

1 голос
/ 18 июня 2020

Dynami c рекомендации по данным

Вы можете получить счетчик и использовать 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.

enter image description here

При запуске SELECT *FROM [dbo].[20200618].

enter image description here

Выполнить SELECT ID,Column1,Column2 FROM [dbo].[20200618] UNPIVOT(Column1 for Column2 in ([Annual],[Revenue],[Completed]))b where ID=2.

enter image description here

Наконец, запустите код.

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 

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...