SQL Server: объединить идентификатор первичного ключа в сгруппированном выражении - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь выбрать сгруппированный набор строк и объединить значения первичного ключа этих строк в оператор выбора, а также подсчитать строки и выбрать это значение.

Таблица:

  • JobTable - JobID, ExpressJob, ItemID
  • ItemTable - ItemID, цвет, размер

Значения в Jobs:

10001, true, 3
10002, true, 3
10003, false, 4

Значения в Items:

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. Из того, что я исследовал в сети, FROM XML - это путь, но по какой-то причине он не эффективен при выборе столбца ID.

1 Ответ

0 голосов
/ 05 ноября 2018

Небольшая настройка того, что у вас уже есть, приведет вас туда. Попробуйте это:

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