我有这个表结构
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)
如果我查询主表,这些列会重复使用相同的值,其中列表是不同的数据
我搜索了一个解决方案,发现使用数据表插入和检索可能会发生这种情况
您可以使用 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","扣除":"缺勤"}] |