【问题标题】:TSQL - Pivot not returning all rowsTSQL - 枢轴不返回所有行
【发布时间】:2019-08-23 03:18:56
【问题描述】:

我有以下 JSON 数组数据集需要解析成 2 个表行:

[        
  {           "eid": "ABCDGD",          
              "name": "Carol E",          
              "email": "carole@gmail.com",                        
              "role": "Recruiter"        
  },      
  {           "eid": "HDHDK",          
              "name": "Mark H",          
              "email": "markh@gmail.com",                       
              "role": "Manager"    
   }      
 ]

我需要下面的代码来返回两组员工信息,但它只返回一个。我如何做到这一点?

select p.* from 
(SELECT j2.[key] as _keys, j2.Value as _vals
FROM OPENJSON(@c) j1
CROSS APPLY OPENJSON(j1.Value) j2
) as pds
PIVOT
(
  max(pds._vals)
  FOR pds._keys IN([eid], [name], [email], [role])
) AS p

SQLfiddle - http://sqlfiddle.com/#!18/9eecb/54970

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    无需转置,只需指定您的 json 列,就会给出您想要的结果。

    SELECT *  
    FROM OPENJSON(@c) WITH (   
                  eid   varchar(200)   '$.eid',  
                  name  varchar(200)   '$.name',  
                  email varchar(200)   '$.email',  
                  role  varchar(200)   '$.role'
     ) j1
    

    【讨论】:

      【解决方案2】:

      JSON里面已经维护了一个table kind结构,可以直接用OPENJSON转换成table。

      作为 MSDN 网站上的 OPENJSON 语法。

      OPENJSON( jsonExpression [ , path ] )  [ <with_clause> ]
      
      <with_clause> ::= WITH ( { colName type [ column_path ] [ AS JSON ] } [ ,...n ] )
      
      

      这里只需要传递您在 JSON 中维护的列名,并将您的 JSON 转换为 SQL Table
      您可以在此link 上找到更多详细信息。

      对于您的上述查询,您可以试试这个。

      DECLARE @json NVARCHAR(MAX)
      SET @json =  
      N'[        
        {           "eid": "ABCDGD",          
                    "name": "Carol E",          
                    "email": "carole@gmail.com",                        
                    "role": "Recruiter"        
        },      
        {           "eid": "HDHDK",          
                    "name": "Mark H",          
                    "email": "markh@gmail.com",                       
                    "role": "Manager"    
         }      
       ]'  
      
      SELECT *  
      FROM OPENJSON(@json)  
        WITH ( 
              eid nvarchar(50) '$.eid', 
              name nvarchar(50) '$.name', 
              email nvarchar(50) '$.email', 
              role nvarchar(50) '$.role', 
             ) 
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-10
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        相关资源
        最近更新 更多