【问题标题】:How to sum up the values and also cast it to varchar so that I can get output in JSON format in SQL server 2005?如何总结这些值并将其转换为 varchar 以便我可以在 SQL Server 2005 中以 JSON 格式获得输出?
【发布时间】:2016-02-01 07:10:50
【问题描述】:

我想总结收入的值并按产品名称对其进行分组。我使用了以下方式。但是我无法汇总这些值并将其同时转换为 varchar,因为只有将其转换为 varchar 时才能获得 JSON 格式的结果。 这是我的查询

select '[' + STUFF(( select ',{"id":' + cast(id as varchar(max)) + ',"ProductName":"' + ProductName + '"' + ',"Revenue":'

+ cast(Revenue as varchar(max)) + ',"InYear":' + CONVERT(VARCHAR(10), InYear, 111) +'}' 来自 dummyRevenueData 其中 InYear>='2014/01/01' 和 InYear

以上查询结果:

[{"id":2,"ProductName":"P1","Revenue":700,"InYear":2014/01/01},{"id":3,"ProductName":"p1","Revenue":800,"InYear":2015/01/01},{"id":4,"ProductName":"p1","Revenue":900,"InYear":2016/01/01},{"id":6,"ProductName":"P2","Revenue":600,"InYear":2014/01/01},{"id":7,"ProductName":"P2","Revenue":200,"InYear":2015/01/01},{"id":8,"ProductName":"P2","Revenue":400,"InYear":2016/01/01},{"id":10,"ProductName":"p3","Revenue":100,"InYear":2014/01/01},{"id":11,"ProductName":"p3","Revenue":500,"InYear":2015/01/01},{"id":12,"ProductName":"p3","Revenue":400,"InYear":2016/01/01}]  

我想总结收入,我的输出应该在

[{"ProductName":"P1","Revenue":2400},

{"ProductName":"p2","Revenue":1000}, {"ProductName":"p3","Revenue":1200}]

我尝试了以下查询,但没有得到结果:

 select '[' + STUFF(( select ',{"id":' + cast(id as varchar(max)) + ',"ProductName":"' + ProductName + '"' + ',"Revenue":'

+ cast((sum(Revenue) as Rev) as varchar(max)) + ',"InYear":' + CONVERT(VARCHAR(10), InYear, 111) +'}' 来自 dummyRevenueData 其中 InYear>='2014/01/01' 和 InYear

【问题讨论】:

    标签: sql-server json casting


    【解决方案1】:

    为什么不在第一次选择时使用 GROUP BY 来检索数据

    然后使用 CAST 获取 JSON 格式的结果

    SELECT CONCAT('[', GROUP_CONCAT(jsonEntry SEPARATOR ','), ']') AS jsonEntries
    FROM 
      (
          SELECT '{'+ 
                   '",ProductName":"' + ProductName + '"' + 
                   ',"Revenue":"' + CAST(SumRevenue as varchar(SumRevenue)) + '"' + 
                 '}' AS jsonEntry
          FROM
          (
               SELECT id, ProductName, SUM(Revenue) as SumRevenue 
               FROM dummyRevenueData 
               WHERE InYear>='2014/01/01' AND InYear<='2016/01/01'
               GROUP BY ProductName
          ) AS rawData
    
      ) AS stringData
    

    虚拟收入数据:

    id | ProductName | Revenue | InYear
    ---------------------------------------
    2  | p1          | 700     | 2014/01/01
    3  | p1          | 800     | 2015/01/01
    4  | p1          | 900     | 2016/01/01
    6  | P2          | 600     | 2014/01/01
    7  | P2          | 200     | 2015/01/01
    8  | P2          | 400     | 2016/01/01
    10 | p3          | 100     | 2014/01/01
    11 | p3          | 500     | 2015/01/01
    12 | p3          | 400     | 2016/01/01
    

    原始数据:

    ProductName | SumRevenue
    ------------------------
    p1          | 2400
    P2          | 1200
    p3          | 1000
    

    字符串数据:

    jsonEntry
    ------------------------------------
    {"ProductName":"p1","Revenue":"2400"}
    {"ProductName":"P2","Revenue":"1200"}
    {"ProductName":"p3","Revenue":"1000"}
    

    jsonEntries:

    [{"ProductName":"p1","Revenue":"2400"},{"ProductName":"P2","Revenue":"1200"},{"ProductName":"p3","Revenue":"1000"}]
    

    在dummyRevenueData中添加ProductId,这样就可以按ProductId分组了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-29
      • 2020-08-07
      • 1970-01-01
      • 2011-08-18
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多