Получение повторяющихся значений после использования предложения Group by - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть таблица, подобная этой:

+------------+---------------+--------------------------+---------+
| GeneralKey |     Label     |         Extended         | OrderID |
+------------+---------------+--------------------------+---------+
|         63 | Take-Off      | Project Status           |       1 |
|         64 | Hold          | Project Status           |       3 |
|         65 | Pending       | Project Status           |       5 |
|         66 | Contracted    | Project Status           |       6 |
|         67 | Dead          | Project Status           |       7 |
|         86 | Pricing       | Project Status           |       4 |
|         99 | Bid Request   | Project Status           |       0 |
|        100 | Take-Off      | Design Contracted Status |       0 |
|        101 | Hold          | Design Contracted Status |       2 |
|        102 | Pricing       | Design Contracted Status |       3 |
|        103 | Issued        | Design Contracted Status |       4 |
|        104 | In-House      | Design Contracted Status |       5 |
|        105 | Shops/layouts | Project Status           |       2 |
|        106 | Shops/layouts | Design Contracted Status |       1 |
+------------+---------------+--------------------------+---------+

И у меня есть хранимая процедура для использования этой таблицы, например:

BEGIN

        DECLARE @Parameter1 VARCHAR(50)
        DECLARE @Parameter2 VARCHAR(50);
        ;WITH CTE
            AS (SELECT
                    *
                   , ROW_NUMBER() OVER(ORDER BY
                                          (SELECT
                                                NULL
                                          )) AS [rn]
                    FROM STRING_SPLIT(@Extended , ','))
            SELECT
                 @Parameter1 = MAX(CASE
                                   WHEN [rn] = 1
                                   THEN VALUE
                                END)
                , @Parameter2 = MAX(CASE
                                   WHEN [rn] = 2
                                   THEN VALUE
                                END)
                 FROM [CTE]

        SELECT
             [GeneralKey]
            , [Label]
             FROM [General]
             WHERE [Extended] = (SELECT
                                   @Parameter1)
                  OR [Extended] = (SELECT
                                     @Parameter2)
             GROUP BY
                    [Label]
                   ,[GeneralKey]
                   , [OrderID]
             ORDER BY
                    [OrderID];
    END

Проблема в том, когда я выполняю ее с exec инструкция

usp_Get_StatusListByDesignType @Extended = 'Project Status,Design Contracted Status'

Возвращает повторные значения Label:

+------------+---------------+
| GeneralKey |     Label     |
+------------+---------------+
|         99 | Bid Request   |
|        100 | Take-Off      |
|         63 | Take-Off      |
|        106 | Shops/layouts |
|        105 | Shops/layouts |
|        101 | Hold          |
|        102 | Pricing       |
|         64 | Hold          |
|        103 | Issued        |
|         86 | Pricing       |
|        104 | In-House      |
|         65 | Pending       |
|         66 | Contracted    |
|         67 | Dead          |
+------------+---------------+

Как вы видите, у меня есть повторяющиеся значения (метка), предложение GROUP BY не работает для сохраненныхпроцедура.Что я делаю неправильно?С уважением

ОБНОВЛЕНИЕ

Как комментарии ниже, я пытаюсь включить GeneralKey с агрегатной функцией, например:

 SELECT
                 SUM([GeneralKey])
                , [Label]
                 FROM [General]
                 WHERE [Extended] IN (@Parameter1, @Parameter2)
                GROUP BY 
                [Label]
                ,[OrderID]
                 ORDER BY
                        [OrderID];

Но я получаю те же результаты

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Какое бы поле вы ни добавили в GROUP BY, оно будет собирать ваш результирующий набор.Если одно из этих полей более детализировано, чем вы хотите, тогда оно ДОЛЖНО быть удалено из вашей группы, иначе ваш результирующий набор примет эту гранулярность.

В вашем случае (ваша последняя попытка) у вас есть OrderID в вашей группе.Поскольку у вас есть несколько OrderID для каждого Label, ваш результирующий набор будет на гранулярности OrderID, когда вы захотите, чтобы он был на гранулярности поля Label.

Простой запрос здесь, чтобы сделать то, что вы хотите, будет:

SELECT SUM(GeneralKey)
    ,Label
FROM General
WHERE Extended IN (
        @Parameter1
        ,@Parameter2
        )
GROUP BY Label;

Если вам нужен OrderID, чтобы быть частью этого (возможно, для заказа), то вам нужно агрегировать поit:

SELECT SUM(GeneralKey)
    ,Label
FROM General
WHERE Extended IN (
        @Parameter1
        ,@Parameter2
        )
GROUP BY Label
ORDER BY MAX(OrderId)

ORDER BY - это один из последних шагов, которые выполняет СУБД при обработке данных.Это происходит ПОСЛЕ GROUP BY, поэтому вам нужно будет указать ему, как агрегировать поле, по которому вы хотите ORDER BY, если это поле находится на более глубоком уровне детализации, чем вы хотите в наборе результатов.

0 голосов
/ 21 сентября 2018

Вот как вы можете получить список совпадений, разделенных запятыми, в вычисляемое поле.

DECLARE @T TABLE(GeneralKey INT, Label NVARCHAR(50), OrderID INT, Extended NVARCHAR(50))
INSERT @T VALUES (99,'Bid-Request',1,'Project Status'),(100,'Take-Off',3,'Project Status'),(63,'Bid-Request',5,'Project Status'),(199,'Bid-Request',10,'Design Contracted Status')

DECLARE @Extended NVARCHAR(50) = 'Project Status,Design Contracted Status'

DECLARE @Parameter1 VARCHAR(50) ='Project Status'
DECLARE @Parameter2 VARCHAR(50) = 'Design Contracted Status'

SELECT
    T.Label,
    MInOrderId = MIN(OrderID),
    MaxOrderID = MAX(OrderID),
    GeneralKeys=
        STUFF((
            SELECT ', ' + CONVERT(VARCHAR(10), GeneralKey)
            FROM @T This WHERE This.Label = T.Label AND This.Extended IN(@Parameter1,@Parameter2)
            FOR XML PATH ('')) , 1, 1, ''),
    OrderIds=
        STUFF((
            SELECT ', ' + CONVERT(VARCHAR(10), OrderID)
            FROM @T This WHERE This.Label = T.Label AND This.Extended IN(@Parameter1,@Parameter2)
            FOR XML PATH ('')) , 1, 1, ''),      
    ExtendedIds=
        STUFF((
            SELECT DISTINCT ', ' +  Extended
            FROM @T This WHERE This.Label = T.Label AND This.Extended IN(@Parameter1,@Parameter2)
            FOR XML PATH ('')) , 1, 1, '')   
FROM 
    @T T
WHERE 
    Extended IN (@Parameter1,@Parameter2)
GROUP BY
    T.Label
ORDER BY
   MIN(OrderID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...