返回包含列和包含其他列的列表的自定义查询

问题描述 投票:0回答:1

我有这个表结构

CREATE TABLE md 
(
    laborOfficeId NVARCHAR(2),
    sequenceNumber NVARCHAR(12),
    unifiedNationalNumber NVARCHAR(MAX),
    nationalId NVARCHAR(MAX) not null,
    paidStatus NVARCHAR(3) not null, -- Assuming Yes/No as values
    bankName NVARCHAR(MAX),
    Iban NVARCHAR(MAX),
    WPSalary NVARCHAR(MAX), -- Assuming it's a decimal value
    paidYearMonth CHAR(6) not null, -- Assuming the format is fixed as YYYYMM
    deductionAmount NVARCHAR(MAX), -- Assuming it's a decimal value
    deduction NVARCHAR(MAX)
);

INSERT INTO md (laborOfficeId, sequenceNumber, unifiedNationalNumber, nationalId, paidStatus, bankName, Iban, WPSalary, paidYearMonth, deductionAmount, deduction)
VALUES 
('1', '123456', '70023455436', '1143575354', 'yes', 'alrajhi', 'SA4420000422608010555321', '5000.00', '202401', '73.00', 'Absents'),
('1', '123456', '70023455436', '1143575354', 'yes', 'alrajhi', 'SA4420000422608010555321', '5000.00', '202402', '73.00', 'Absents'),
('1', '123456', '70023455436', '1143575354', 'yes', 'alrajhi', 'SA4420000422608010555321', '5000.00', '202403', '73.00', 'Absents');


SELECT * FROM md

我想编写一个 SQL 查询来返回不同的结果

返回

laborOfficeId,
sequenceNumber,
unifiedNationalNumber,
nationalId

带有 paystatuslist 列表,它是包含其他表列的对象数组(paidStatus、bankName、Iban、WPSalary、paidYearMonth、deductionAmount、deduction)

如果我查询主表,这些列会重复使用相同的值,其中列表是不同的数据

我搜索了一个解决方案,发现使用数据表插入和检索可能会发生这种情况

sql-server join relational-database
1个回答
0
投票

您可以使用 FOR JSON 将输出直接格式化为 JSON,以便为 labourOfficeId、sequenceNumber、unifiedNationalNumber 和NationalId 的每个唯一组合创建对象列表。

CREATE TABLE md (
        laborOfficeId NVARCHAR(2),
        sequenceNumber NVARCHAR(12),
        unifiedNationalNumber NVARCHAR(MAX),
        nationalId NVARCHAR(MAX) not null,
        paidStatus NVARCHAR(3) not null, -- Assuming Yes/No as values
        bankName NVARCHAR(MAX),
        Iban NVARCHAR(MAX),
        WPSalary NVARCHAR(MAX), -- Assuming it's a decimal value
        paidYearMonth CHAR(6) not null, -- Assuming the format is fixed as YYYYMM
        deductionAmount NVARCHAR(MAX), -- Assuming it's a decimal value
        deduction NVARCHAR(MAX)
    );
   
    INSERT INTO md (laborOfficeId, sequenceNumber, unifiedNationalNumber, nationalId, paidStatus, bankName, Iban, WPSalary, paidYearMonth, deductionAmount, deduction)
    VALUES 
    ('1', '123456', '70023455436', '1143575354', 'yes', 'alrajhi', 'SA4420000422608010555321', '5000.00', '202401', '73.00', 'Absents')
    ,
    ('1', '123456', '70023455436', '1143575354', 'yes', 'alrajhi', 'SA4420000422608010555321', '5000.00', '202402', '73.00', 'Absents')
    ,
    ('1', '123456', '70023455436', '1143575354', 'yes', 'alrajhi', 'SA4420000422608010555321', '5000.00', '202403', '73.00', 'Absents')
    ;
SELECT 
    laborOfficeId,
    sequenceNumber,
    unifiedNationalNumber,
    nationalId,
    (SELECT 
        paidStatus, 
        bankName,
        Iban,
        WPSalary,
        paidYearMonth,
        deductionAmount,
        deduction 
     FROM md AS md2
     WHERE md2.laborOfficeId = md.laborOfficeId 
       AND md2.sequenceNumber = md.sequenceNumber 
       AND md2.unifiedNationalNumber = md.unifiedNationalNumber 
       AND md2.nationalId = md.nationalId
     FOR JSON PATH) AS paidStatusList
FROM md
GROUP BY laborOfficeId, sequenceNumber, unifiedNationalNumber, nationalId;

劳工办公室ID 序列号 全国统一号码 国民身份证 付费状态列表
1 123456 70023455436 1143575354 [{"paidStatus":"是","bankName":"alrajhi","Iban":"SA4420000422608010555321","WPSalary":"5000.00","paidYearMonth":"202401","deductionAmount":"73.00" ,"扣除":"缺席"},{"paidStatus":"是","bankName":"alrajhi","Iban":"SA4420000422608010555321","WPSalary":"5000.00","paidYearMonth":"202402" ,"deductionAmount":"73.00","deduction":"Absents"},{"paidStatus":"是","bankName":"alrajhi","Iban":"SA4420000422608010555321","WPSalary":"5000.00" ,"paidYearMonth":"202403","扣除金额":"73.00","扣除":"缺勤"}]

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.