SQL Server:在分组语句中连接主键ID
我试图选择一组分组的行,并将这些行的主键值连接到select语句中,同时对行进行计数并选择该值 表:SQL Server:在分组语句中连接主键ID,sql,sql-server,tsql,string-aggregation,Sql,Sql Server,Tsql,String Aggregation,我试图选择一组分组的行,并将这些行的主键值连接到select语句中,同时对行进行计数并选择该值 表: 作业表-JobID、ExpressJob、ItemID ItemTable-项目ID、颜色、大小 作业中的值: 10001, true, 3 10002, true, 3 10003, false, 4 项中的值: 3, Blue, 1-2 4, Pink, 5-6 结果集: 3,Blue,1-2,10001|10002 3,Pink,5-6,10003 我在select语句中探讨了以
-JobID、ExpressJob、ItemID作业表
-项目ID、颜色、大小ItemTable
作业中的值
:
10001, true, 3
10002, true, 3
10003, false, 4
项中的值
:
3, Blue, 1-2
4, Pink, 5-6
结果集:
3,Blue,1-2,10001|10002
3,Pink,5-6,10003
我在select语句中探讨了以下内容:
SELECT
i.ItemID, i.Colour, i.Size,
COUNT(i.ItemID) AS Quantity,
j.ExpressJob,
JobIDArray = STUFF((SELECT CONVERT(VARCHAR(10), jb.JOBID)
FROM Jobs jb
WHERE jb.JobID = j.JobID
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, ''))
FROM
Jobs j
INNER JOIN
Items i ON i.ItemID = j.ItemID
GROUP BY
i.ItemID, i.Colour, i.Size, j.ExpressJob
但是我一直在
JobID
上收到一个聚合组错误。根据我从XML在线研究的内容,这是一种方法,但由于某些原因,在选择ID列时效果不佳。对现有内容稍加调整即可。
尝试一下:
DECLARE @Jobs TABLE
(
[JobID] INT
, [ExpressJob] NVARCHAR(100)
, [ItemID] INT
);
DECLARE @Items TABLE
(
[ItemID] INT
, [Colour] NVARCHAR(100)
, [Size] NVARCHAR(100)
);
INSERT INTO @Jobs (
[JobID]
, [ExpressJob]
, [ItemID]
)
VALUES ( 10001, 'true', 3 )
, ( 10002, 'true', 3 )
, ( 10003, 'false', 4 );
INSERT INTO @Items (
[ItemID]
, [Colour]
, [Size]
)
VALUES ( 3, 'Blue', '1-2' )
, ( 4, 'Pink', '5-6' );
SELECT [i].[ItemID]
, [i].[Colour]
, [i].[Size]
, [j].[ExpressJob]
, COUNT([i].[ItemID]) AS [Quantity]
--Added '|' as that was how you wanted the results delimited
, STUFF((
SELECT '|' + CONVERT(VARCHAR(10), [jb].[JobID])
FROM @Jobs [jb]
WHERE [jb].[ItemID] = [i].[ItemID] --Change here as you're looking for JobID associated to the Item.
FOR XML PATH('') --No need to set TYPE or use '.value'
)
, 1
, 1
, ''
) AS JobIDArray
FROM @Jobs [j]
INNER JOIN @Items [i]
ON [i].[ItemID] = [j].[ItemID]
GROUP BY [i].[ItemID]
, [i].[Colour]
, [i].[Size]
, [j].[ExpressJob];
对你已经拥有的东西稍加调整就能达到目的。 尝试一下:
DECLARE @Jobs TABLE
(
[JobID] INT
, [ExpressJob] NVARCHAR(100)
, [ItemID] INT
);
DECLARE @Items TABLE
(
[ItemID] INT
, [Colour] NVARCHAR(100)
, [Size] NVARCHAR(100)
);
INSERT INTO @Jobs (
[JobID]
, [ExpressJob]
, [ItemID]
)
VALUES ( 10001, 'true', 3 )
, ( 10002, 'true', 3 )
, ( 10003, 'false', 4 );
INSERT INTO @Items (
[ItemID]
, [Colour]
, [Size]
)
VALUES ( 3, 'Blue', '1-2' )
, ( 4, 'Pink', '5-6' );
SELECT [i].[ItemID]
, [i].[Colour]
, [i].[Size]
, [j].[ExpressJob]
, COUNT([i].[ItemID]) AS [Quantity]
--Added '|' as that was how you wanted the results delimited
, STUFF((
SELECT '|' + CONVERT(VARCHAR(10), [jb].[JobID])
FROM @Jobs [jb]
WHERE [jb].[ItemID] = [i].[ItemID] --Change here as you're looking for JobID associated to the Item.
FOR XML PATH('') --No need to set TYPE or use '.value'
)
, 1
, 1
, ''
) AS JobIDArray
FROM @Jobs [j]
INNER JOIN @Items [i]
ON [i].[ItemID] = [j].[ItemID]
GROUP BY [i].[ItemID]
, [i].[Colour]
, [i].[Size]
, [j].[ExpressJob];