mysql - 如何使用TSQL生成Json

标签 mysql sql sql-server json

我正在尝试根据表格数据库 sqlserver/mysql 中已经存在的数据为 mongodb 设计源文档。

为了练习,我准备了三张表客户、产品和订单交易,架构如下

USE scratch
GO

CREATE TABLE Customer(customer_id int identity(1,1), FirstName varchar(100),LastName varchar(100));

Create TAble Product(Product_id int identity(1,1), Name varchar(100), Price numeric(18,2), Unit varchar(10));


CREATE TABLE OrderTransaction(Tr_id int identity(1,1), customer_id int, Product_id int ,Quantity int, TotalCost numeric, trdate datetime, weigh int , weighunit varchar(100));


INSERT INTO Customer(FirstName,LastName)

SELECT 'Harry','G'
UNION ALL
SELECT 'Jenne','G'
UNION ALL
SELECT 'Gill','G'
UNION ALL
SELECT 'Tom','G'
UNION ALL
SELECT 'Bai','G'



INSERT INTO Product(Name,Price, Unit )
SELECT 'Sugar',100,'kg'
UNION ALL
SELECT 'Olive Oil',500,'litre'
UNION ALL
SELECT 'Loreal Face Wash',200,NULL
UNION ALL
SELECT 'FLour',400,'kg'
UNION ALL
SELECT 'Onion',20,'kg'
UNION ALL
SELECT 'Potato',10,'kg'



INSERT INTO OrderTransaction(customer_id,Product_id,Quantity,TotalCost,trdate,weigh,weighunit)
SELECT 1,1,5,500,GETDATE()-40,5,'kg'
UNION ALL
SELECT 1,2,1,2500,GETDATE()-40,5,'litre'
UNION ALL
SELECT 1,3,5,500,GETDATE()-30,5,'kg'
UNION ALL
SELECT 1,4,1,200,GETDATE()-30,NULL,NULL
UNION ALL
SELECT 1,5,5,100,GETDATE(),5,'kg'
UNION ALL
SELECT 1,6,5,50,GETDATE(),5,'kg'

UNION ALL
SELECT 2,1,5,500,GETDATE()-40,5,'kg'
UNION ALL
SELECT 2,2,1,2500,GETDATE()-40,5,'litre'
UNION ALL
SELECT 2,3,5,500,GETDATE()-30,5,'kg'
UNION ALL
SELECT 2,4,1,200,GETDATE()-30,NULL,NULL
UNION ALL
SELECT 2,5,5,100,GETDATE(),5,'kg'
UNION ALL
SELECT 2,6,5,50,GETDATE(),5,'kg'

我在 sql server 2016 中尝试过 Json Path 但没有找到任何文档 为了根据客户对交易进行分组,它将每笔交易创建为一个文档。

select a.customer_id as 'Customer.customer_id' 
,FirstName as 'Customer.FirstName'
,LastName as 'Customer.LastName'
,Tr_id as 'Customer.AllTransaction.Tr_id'
,b.Product_id as 'Customer.AllTransaction.Product_id'
,Quantity as 'Customer.AllTransaction.Quantity'
,TotalCost as 'Customer.AllTransaction.TotalCost'
,p.Name as 'Customer.AllTransaction.ProductName'


from Customer a
inner join OrderTransaction b
on a.customer_id=b.customer_id
inner join Product p
on b.Product_id=p.Product_id
FOR JSON PATH 

我想编写一个查询来准备 json,例如:

[
  {
    "customer_id": 1,
    "FirstName": "Harry",
    "LastName": "G",
    "totalsales": 3850.0,
    "LastTransactionDate": "2014-12-1208: 42: 00.000Z",
    "AllTransctionList": [
      {
        "Tr_id": 1,
        "Product_id": 1,
        "Quantity": 5,
        "TotalCost": 500,
        "ProductName": "Sugar"
      },
      {
        "Tr_id": 2,
        "Product_id": 2,
        "Quantity": 1,
        "TotalCost": 2500,
        "ProductName": "Olive Oil"
      },
      {
        "Tr_id": 3,
        "Product_id": 3,
        "Quantity": 5,
        "TotalCost": 500,
        "ProductName": "Loreal Face Wash"
      },
      {
        "Tr_id": 4,
        "Product_id": 4,
        "Quantity": 1,
        "TotalCost": 200,
        "ProductName": "FLour"
      },
      {
        "Tr_id": 5,
        "Product_id": 5,
        "Quantity": 5,
        "TotalCost": 100,
        "ProductName": "Onion"
      },
      {
        "Tr_id": 6,
        "Product_id": 6,
        "Quantity": 5,
        "TotalCost": 50,
        "ProductName": "Potato"
      }
    ]
  },
  {
    "customer_id": 2,
    "FirstName": "Jenne",
    "LastName": "G",
    "totalsales": 3850.0,
    "LastTransactionDate": "2014-12-1208: 42: 00.000Z",
    "AllTransctionList": [
      {
        "Tr_id": 1,
        "Product_id": 1,
        "Quantity": 5,
        "TotalCost": 500,
        "ProductName": "Sugar"
      },
      {
        "Tr_id": 2,
        "Product_id": 2,
        "Quantity": 1,
        "TotalCost": 2500,
        "ProductName": "Olive Oil"
      },
      {
        "Tr_id": 3,
        "Product_id": 3,
        "Quantity": 5,
        "TotalCost": 500,
        "ProductName": "Loreal Face Wash"
      },
      {
        "Tr_id": 4,
        "Product_id": 4,
        "Quantity": 1,
        "TotalCost": 200,
        "ProductName": "FLour"
      },
      {
        "Tr_id": 5,
        "Product_id": 5,
        "Quantity": 5,
        "TotalCost": 100,
        "ProductName": "Onion"
      },
      {
        "Tr_id": 6,
        "Product_id": 6,
        "Quantity": 5,
        "TotalCost": 50,
        "ProductName": "Potato"
      }
    ]
  }
]

最佳答案

为了让你开始,你可以使用像

这样的东西
SELECT a.customer_id as 'customer_id' 
,FirstName as 'FirstName'
,LastName as 'LastName'
,Tr_id as 'Tr_id'
,Quantity as 'Quantity'
,TotalCost as 'TotalCost'
from Customer a 
inner join OrderTransaction AllTransactionList
on a.customer_id=AllTransactionList.customer_id
FOR JSON AUTO 

您可以先获取产品数据,而不是加入 OrderTransaction,或者在选择列表中使用子选择,如 this示例(查询 3)。

喜欢:

USE scratch
GO




SELECT a.customer_id     AS 'customer_id' 
,FirstName               AS 'FirstName'
,LastName                AS 'LastName'
,LastTransactionDate
,totalsales
,Tr_id                   AS 'Tr_id'
,ProductName
,Quantity                AS 'Quantity'
,TotalCost               AS 'TotalCost'
FROM 
(SELECT c.customer_id 
,FirstName
,LastName 
,MAX(trdate) LastTransactionDate
,SUM(TotalCost)totalsales

FROM Customer c
INNER JOIN OrderTransaction o
ON c.customer_id=o.customer_id
GROUP BY  
c.customer_id 
,FirstName
,LastName )a

INNER JOIN 
    (SELECT 
    o.Tr_id
    ,o.customer_id
    ,p.Name AS ProductName
    ,o.Quantity
    ,o.TotalCost
    ,o.trdate
    ,o.weigh
    ,o.weighunit 
    FROM OrderTransaction o
    INNER JOIN Product p
    ON o.Product_id=p.Product_id)AllTransactionList

ON a.customer_id=AllTransactionList.customer_id

FOR JSON AUTO 

关于mysql - 如何使用TSQL生成Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44413517/

相关文章:

java - 将 mariaDB 客户端与 MySQL 数据库集成的问题

c# - 删除表时 ExecuteNonQuery 会返回什么?

sql - 按随机和字段排序 MySQL 查询?

sql - 是否有任何抽象层可以与 GFS 或 HDFS 一起使用?

java - Maven Shade Plugin + MsSQL JDBC -> 即时JNI错误 - Invalid signature file Manifest

mysql 通过 SQL_CALC_FOUND_ROWS 删除查询

mysql - 无法以管理员身份连接 MySQL Workbench

sql - 如何从hsql中的序列中获取接下来的10个值

SQL查询计算不同条件满足的结果数

sql-server - SQL Server 触发器帮助