как использовать группу по функции в условии? - PullRequest
0 голосов
/ 28 сентября 2018

мой внутренний запрос работает хорошо, но когда я использую группу за функцией, я получаю сообщение об ошибке "Column 'b.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause." Я использовал несколько трюков, но ни один из них не работает (как отдельные)

select * from (
        SELECT  tsr.id,tblstckid,ts.articleNo,ts.code,size,ts.insertDate  FROM [tbl_setsRegister] tsr
APPLY dbo.Split1(tsr.tblstckid, ',') AS htvf 
        inner join tbl_stock ts on ts.id=htvf.Item where ts.id not in(60,62) and ts.articleNo='121010' and code='unknown-1')
group by b.tblstckid

что яхочу получить различные значения из tblstckid с другими столбцами также

пример данных

id  tblstckid   articleNo   cCode   size    insertDate
21  55,56,58,   121010  unknown-1   34  2018-09-20 19:44:00.000
21  55,56,58,   121010  unknown-1   36  2018-09-20 19:44:00.000
21  55,56,58,   121010  unknown-1   38  2018-09-20 19:44:00.000
22  57,         121010  unknown-1   36  2018-09-20 19:44:00.000
23  59,61,63,   121010  unknown-1   34  2018-09-20 19:46:00.000
23  59,61,63,   121010  unknown-1   36  2018-09-20 19:46:00.000

я хочу избавиться от дубликата tblstckid

Ответы [ 2 ]

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

Вы должны применить статистическую функцию ко всем столбцам, не указанным в предложении GROUP BY.Возможное решение:

SELECT
    id, tblstckid, articleNo, code,
    SUM(size) AS tot_size, MAX(ts.insertDate) AS lastInsertDate
FROM (
    SELECT tsr.id, tblstckid, ts.articleNo, ts.code, size, ts.insertDate
    FROM [tbl_setsRegister] tsr
    APPLY dbo.Split1(tsr.tblstckid, ',') AS htvf 
    INNER JOIN tbl_stock ts
        ON ts.id = htvf.Item
    WHERE ts.id NOT IN(60,62) AND ts.articleNo = '121010' AND code = 'unknown-1'
) b
GROUP BY id, tblstckid, articleNo, code

Вы должны решить, какая функция агрегирования наиболее целесообразна.Если вы хотите сохранить все значения, вы также можете использовать STRING_AGG

 STRING_AGG (CAST(size AS varchar(10), ', ') AS sizes
0 голосов
/ 28 сентября 2018

Вы должны поместить все столбцы SELECT-списка в GROUP BY, кроме столбцов агрегации.Когда вы выбираете все, но помещаете только один столбец в GROUP BY, выдается ошибка

SELECT b.tblstckid
FROM (
    SELECT tsr.id, tblstckid, ts.articleNo, ts.code, size, ts.insertDate
    FROM [tbl_setsRegister] tsr
    APPLY dbo.Split1(tsr.tblstckid, ',') AS htvf 
    INNER JOIN tbl_stock ts
        ON ts.id = htvf.Item
    WHERE ts.id NOT IN(60,62) AND ts.articleNo = '121010' AND code = 'unknown-1'
) b
GROUP BY b.tblstckid

Однако, поскольку у вас нет агрегатной функции, но вы использовали GROUP BY, которая сбивает с толку

Вы можете использовать row_number

SELECT * FROM
(
    SELECT tsr.id, tblstckid, ts.articleNo, ts.code, size, ts.insertDate,
        ROW_NUMBER() OVER(
            PARTITION BY tsr.id, tblstckid, ts.articleNo, ts.code, ts.insertDate
            ORDER BY size
        ) AS rn
    FROM [tbl_setsRegister] tsr
    APPLY dbo.Split1(tsr.tblstckid, ',') AS htvf 
    INNER JOIN tbl_stock ts
        ON ts.id = htvf.Item
    WHERE ts.id NOT IN(60,62) AND ts.articleNo = '121010' AND code = 'unknown-1'
) b
WHERE b.rn=1
...