Выберите создать JSON с данными столбца группы - PullRequest
0 голосов
/ 30 октября 2019

У меня есть таблица в SQLServer, например:

ID | Name | Date    |
=========================
1  | Me   | 2019-30-10  |
2  | Me   | 2019-31-10  |
3  | Me   | 2019-28-10  |
4  | Me   | 2019-29-10  |
5  | You  | 2019-30-10  |
-------------------------

Я хочу выбрать, чтобы отображать данные или группировать данные в формате json как по дате. Я использую FOR JSON для преобразования данных из запроса в JSON, но я не знаю, как написать правильный запрос SELECT:

{
  "Name": {
    "2019-31-10": [
      {
        "Name": "Me"
      }
    ],
    "2019-30-10": [
      {
        "Name": "Me"
      },
      {
        "Name": "You"
      }
    ],
    "2019-29-10": [
      {
        "Name": "Me"
      }
    ],
    "2019-28-10": [
      {
        "Name": "Me"
      }
    ]
  }
}

Может кто-нибудь мне помочь?

Ответы [ 4 ]

2 голосов
/ 30 октября 2019

Я надеюсь, что это работает. Первое редактирование (добавлено для Json Auto)

DECLARE @Date datetime
DECLARE @RESULT varchar(max)
SET @RESULT = '{ "Name":{'

DECLARE CRS_Date CURSOR FOR
SELECT  Date FROM [dbo].[TableExample]  GROUP BY Date
OPEN CRS_Date FETCH NEXT FROM CRS_Date INTO @Date
WHILE @@FETCH_STATUS = 0
  BEGIN
    SET @RESULT = @RESULT + '"' + CONVERT(varchar, @Date, 23) + '":' + 
    (select Name from  [dbo].[TableExample] t where t.Date = @Date    FOR JSON AUTO) +','
  FETCH NEXT FROM CRS_Date INTO @Date
END
CLOSE CRS_Date
DEALLOCATE CRS_Date
SET @RESULT = LEFT(@RESULT, LEN(@RESULT) - 1)
SET @RESULT = @RESULT + '}}'
SELECT
  @RESULT


My Result : 

    {
       "Name":{
          "2019-10-28":[
             {
                "Name":"Me"
             }
          ],
          "2019-10-29":[
             {
                "Name":"Me"
             }
          ],
          "2019-10-30":[
             {
                "Name":"Me"
             },
             {
                "Name":"You"
             }
          ],
          "2019-10-31":[
             {
                "Name":"Me"
             }
          ]
       }
    }
1 голос
/ 30 октября 2019

Я не думаю, что вы можете напрямую сгенерировать вывод JSON с именами ключей переменных ("2019-31-10", "2019-30-10", ...), используя FOR JSON PATH или FOR JSON AUTO. Но если вы используете SQL Server 2017+, вы можете попытаться сгенерировать вывод JSON с помощью JSON_MODIFY(), используя выражение для генерации имен ключей переменных:

Таблица:

CREATE TABLE #Data (
   ID int,
   [Name] varchar(10),
   [Date] date
)
INSERT INTO #Data 
   (ID, [Name], [Date])
VALUES   
   (1, 'Me',  '2019-10-30'),
   (2, 'AA',  '2019-10-31'),
   (3, 'BB',  '2019-10-28'),
   (4, 'Me',  '2019-10-29'),
   (5, 'You', '2019-10-30')

Оператор:

DECLARE @json nvarchar(max) = N'{"Name": {}}'   

SELECT @json = JSON_MODIFY(
   @json, 
   CONCAT('append $.Name."', d.[Date], '"'),  
   JSON_QUERY((SELECT [Name] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER))
)
FROM #Data d
ORDER BY d.[Date] DESC

SELECT @json

Результат:

{
   "Name":{
      "2019-10-31":[
         {
            "Name":"AA"
         }
      ],
      "2019-10-30":[
         {
            "Name":"Me"
         },
         {
            "Name":"You"
         }
      ],
      "2019-10-29":[
         {
            "Name":"Me"
         }
      ],
      "2019-10-28":[
         {
            "Name":"BB"
         }
      ]
   }
}
0 голосов
/ 30 октября 2019

Если я правильно понимаю, вам нужно самостоятельное объединение:

select tm.date, tm.name, ty.name
from t tm left join
     t ty
     on ty.date = tm.date and ty.name = 'you'
where t.name = 'me';

Вы также можете сделать это с условным агрегированием:

select t.date,
       max(case when tm.name = 'me' then tm.name end) as name1,
       max(case when tm.name = 'you' then tm.name end) as name2
from t
group by t.date;
0 голосов
/ 30 октября 2019

Я бы настоятельно рекомендовал против , возвращая один столбец, подобный этому. Вы хотите сохранить целостность данных в столбце вашего имени. Смешивание данных или типов данных в столбце - плохая практика. Заставить SQL Server выполнять преобразование данных - это не то, для чего он предназначен.

Я бы посоветовал вам использовать сценарий powershell, чтобы взять входную таблицу как есть и поработать над этим для создания выходного файла JSON. Для этого существует множество встроенных функций.

Тем не менее, если вы все еще хотите или хотите сделать это таким образом, одним из способов является использование Группировка наборов :

SELECT
    COALESCE([name],[date]) as Name,
    ROW_NUMBER() OVER (ORDER BY T.[date] ASC) AS order_key
FROM
    dbo.myTable T
GROUP BY
 GROUPING SETS (
        ([Name],[date]),
        ([date])    
)
ORDER BY order_key desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...