我有这个桌子的 struct

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

enter image description here

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

归来

laborOfficeId,
sequenceNumber,
unifiedNationalNumber,
nationalId

带有一组paidstatuslist的对象包含其他表列(paidStatus、bank Name、iban、WPSalary、paidYearMonth、ductionAmount、deduction)

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

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

推荐答案

您可以使用FOR XML PATH(‘’)将每行的列值连接成单个字符串.只需澄清.Value(‘.,’NVARCHAR(Max)‘)将确保在避免使用XML格式时将结果视为纯文本

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')
    ;
3 rows affected
SELECT * FROM md
laborOfficeId sequenceNumber unifiedNationalNumber nationalId paidStatus bankName Iban WPSalary paidYearMonth deductionAmount deduction
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;

laborOfficeId sequenceNumber unifiedNationalNumber nationalId paidStatusList
1 123456 70023455436 1143575354 [{"paidStatus":"yes","bankName":"alrajhi","Iban":"SA4420000422608010555321","WPSalary":"5000.00","paidYearMonth":"202401","deductionAmount":"73.00","deduction":"Absents"},{"paidStatus":"yes","bankName":"alrajhi","Iban":"SA4420000422608010555321","WPSalary":"5000.00","paidYearMonth":"202402","deductionAmount":"73.00","deduction":"Absents"},{"paidStatus":"yes","bankName":"alrajhi","Iban":"SA4420000422608010555321","WPSalary":"5000.00","paidYearMonth":"202403","deductionAmount":"73.00","deduction":"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 XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') AS paidStatusList
FROM md
GROUP BY laborOfficeId, sequenceNumber, unifiedNationalNumber, nationalId;
laborOfficeId sequenceNumber unifiedNationalNumber nationalId paidStatusList
1 123456 70023455436 1143575354 yes, alrajhi, SA4420000422608010555321, 5000.00, 202401, 73.00, Absents; yes, alrajhi, SA4420000422608010555321, 5000.00, 202402, 73.00, Absents; yes, alrajhi, SA4420000422608010555321, 5000.00, 202403, 73.00, Absents;
SELECT 
    laborOfficeId,
    sequenceNumber,
    unifiedNationalNumber,
    nationalId,
    (SELECT 
        paidStatus + CHAR(13) + CHAR(10) + 
        bankName + CHAR(13) + CHAR(10) + 
        Iban + CHAR(13) + CHAR(10) + 
        WPSalary + CHAR(13) + CHAR(10) + 
        paidYearMonth + CHAR(13) + CHAR(10) + 
        deductionAmount + CHAR(13) + CHAR(10) + 
        deduction   + CHAR(13) + CHAR(10)
     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 XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') AS paidStatusList
FROM md
GROUP BY laborOfficeId, sequenceNumber, unifiedNationalNumber, nationalId;

laborOfficeId sequenceNumber unifiedNationalNumber nationalId paidStatusList
1 123456 70023455436 1143575354 yes
alrajhi
SA4420000422608010555321
5000.00
202401
73.00
Absents
yes
alrajhi
SA4420000422608010555321
5000.00
202402
73.00
Absents
yes
alrajhi
SA4420000422608010555321
5000.00
202403
73.00
Absents

fiddle

Sql相关问答推荐

当编号和版本的唯一状态更改时报告

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

Microsoft Access UNION将长文本字段限制为255个字符

如何并行SELECT和RESET?

JSON列之间的Postgr聚合

基于前面行的值:当x&>2时重复1,当连续3行x=0时则重复0

使用Lead获取下一个不同的日期

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

在SQL中使用类别值将行转置为列

SQL:如何将相应位置的两个数组中的元素组合在一起

收到%1、%2或%2邮箱的唯一客户

从数据库中查找总和大于或等于查询中的数字的数字

合并分层表SQL中的第一个非空、变化的空位置

聚合内部的条件在哪里?

根据时间值提取记录

一次 Select 语句中按组累计的SQL累计数

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

获取 SQL Server 中每一行的两个-之间的文本

T-SQL 查询计算日期在其他列中定义的日期之间绑定的行数

SQL 查询以填充单个列中的所有值