2017-06-20 6 views
2

Ich bin mit SQL Server 2016 haben diese Abfrage:SQL Server 2016 - JSON-Format Abfrageergebnisse

SELECT TOP (100) 
     brm.practice, 
     (select count(*) from _rl_metadata where practice=brm.practice) As TotalPractice, 
     brm.primary_subject_area, 
     (select count(*) from _rl_metadata where primary_subject_area=brm.primary_subject_area) As TotalSubject, 
     brm.content_id, 
     brm.content_title 
    FROM [_bersin_rl_metadata] AS brm 
    Where brm.is_archive <> 1 and brm.is_published_to_site = 1 

Code eingeben hier

aus dieser Tabelle:

CREATE TABLE [dbo].[_rl_metadata](
    [content_id] [bigint] NOT NULL, 
    [content_title] [varchar](200) NULL, 
    [publish_date] [datetime] NULL, 
    [practice] [nvarchar](50) NULL, 
    [primary_subject_area] [nvarchar](50) NULL 
) 

, die diese zurück Ergebnisse:

enter image description here

Ich möchte diese Ergebnisse in einem hierarchischen JSON-Format anzeigen (ich möchte es in einem radialen d3-Diagramm wie folgt verwenden: https://bl.ocks.org/mbostock/4348373) gruppiert nach der Anzahl der Assets in Practice, dann Subject, und Eigenschaften von jedem Asset (z. Titel, ID, Veröffentlichungsdatum) Gefällt mir:

{ 
    "name": "Research", 
    "children": [{ 
     "name": "Human Resources", 
     "size": 290, 
     "children": [{ 
       "name": "HR & Talent Analytics", 
       "size": 75, 
       "children": [{ "name": "People Analytics Framework" }, { "name": "Data, Big Data and You" }, ...] 
      }, 
      { 
       "name": "HR Org. & Governance", 
       "size": 52, 
       "children": [{ "name": "Structuring the HR Business" }, { "name": "Relationship Management" }, ...] 
      },... 
     ] 
    }] 
} 

Was ist der beste Weg, um diese Struktur mit SQL Server 2016 zu bekommen?

+0

Es gibt einige Beispiele um, e. G. https://docs.microsoft.com/en-us/sql/relational-databases/json/format-query-results-as-json-with-for-json-sql-server – IngoB

Antwort

2

Versuchen folgende Lösung:

DECLARE @SourceTable TABLE (
    Level1_Name NVARCHAR(50) NOT NULL, 
    Level1_Size INT NOT NULL, 
    Level2_Name NVARCHAR(50) NOT NULL, 
    Level2_Size INT NOT NULL, 
    Content  NVARCHAR(100) NOT NULL 
); 
INSERT @SourceTable 
VALUES 
('Leadership', 270, 'Solutions', 70, 'Book #1'), 
('Leadership', 270, 'Solutions', 70, 'Book #2'), 
('Leadership', 270, 'Strategy', 121, 'Book #3'), 
('Leadership', 270, 'Strategy', 121, 'Book #4'), 
('Leadership', 270, 'Strategy', 121, 'Book #5'), 
('Leadership', 270, 'Development', 10, 'Book #6'), 
('Coco Jambo', 111, 'Solutions', 111, 'Book #111'); 

SELECT 
    name = 'Root object', 
    children= (
     SELECT DISTINCT 
      name = lvl1.Level1_Name, 
      size = lvl1.Level1_Size, 
      children= (
       SELECT DISTINCT 
        name = lvl2.Level2_Name, 
        size = lvl2.Level2_Size, 
        children= (
         SELECT DISTINCT 
          name = lvl3.Content 
         FROM @SourceTable lvl3 
         WHERE lvl2.Level1_Name = lvl1.Level1_Name 
         AND  lvl3.Level2_Name = lvl2.Level2_Name 
         FOR JSON PATH 
        ) 
       FROM @SourceTable lvl2 
       WHERE lvl2.Level1_Name = lvl1.Level1_Name 
       FOR JSON PATH 
      ) 
     FROM @SourceTable lvl1 
     FOR JSON PATH 
    ) 
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER 

Ergebnisse:

{ 
    "name": "Root object", 
    "children": [ 
    { 
     "name": "Leadership", 
     "size": 270, 
     "children": [ 
     { 
      "name": "Development", 
      "size": 10, 
      "children": [ 
      { 
       "name": "Book #6" 
      } 
      ] 
     }, 
     { 
      "name": "Solutions", 
      "size": 70, 
      "children": [ 
      { 
       "name": "Book #1" 
      }, 
      { 
       "name": "Book #111" 
      }, 
      { 
       "name": "Book #2" 
      } 
      ] 
     }, 
... 

Demo

+0

Hinweis: 'Level1 {1 | 2 } _Name'-Spalten sollten obligatorisch/NOT NULL sein. –

+0

Danke! Das sieht ziemlich skalierbar aus. Eine Frage, wenn ich mehrere Felder in der Content-Spalte haben möchte (zB ID, Asset_Name, Pub_Date), dann würde man das alles in die Content-Spalte und Delimit stopfen, oder würden Sie jedes Feld zur Quellentabelle hinzufügen (anstelle von Content) habe ID, Asset_Name, Pub_Date)? –

+0

@ lance-p:> Ich würde diese Informationen als separate Spalte innerhalb der Tabelle behalten. –