SQL Server:在分组语句中连接主键ID

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语句中探讨了以

我试图选择一组分组的行,并将这些行的主键值连接到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语句中探讨了以下内容:

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];