Ошибка SQL Server при использовании функции CONCAT в агрегированной сводной функции - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть запрос SQL, который выводит сводку.

Я пытаюсь добавить функцию CONCAT к pivot, но получаю следующую ошибку:

'CONCAT' не является распознанной агрегатной функцией.

Мой текущий код (который выдает ошибку):

SELECT * FROM (
SELECT dateadd(minute,(datediff(minute,0,Time)/15)*15,0) Time,  AREA, COUNT(BLOB) BLOBs, CARS
FROM 
(SELECT BLOB, Time, CARS, DRIVER, [MK], AREA, Tier FROM (
SELECT [BLOB Nbr] BLOB, Time, CARS, [From PT], [To PT], [From PN], [To PN], DRIVER, [MK],
CASE AREA
WHEN '01' THEN '02' WHEN '03' THEN '02'
WHEN '05' THEN '06' WHEN '07' THEN '06'
WHEN '09' THEN '10' WHEN '11' THEN '10'
ELSE AREA END AREA, 
Position, Tier
FROM (
SELECT [BLOB Nbr], T_IME Time, [C NAME] CARS, [From PT], [To PT], [From PN], [To PN], [C V] DRIVER, [MK],
CASE WHEN [From PT] = 'DRIVER' THEN LEFT(RIGHT([From PN],6),2) ELSE LEFT(RIGHT([To PN],6),2) END AREA,
CASE WHEN [From PT] = 'DRIVER' THEN LEFT(RIGHT([From PN],4),2) ELSE LEFT(RIGHT([To PN],4),2) END Position,
CASE WHEN [From PT] = 'DRIVER' THEN RIGHT([From PN],2) ELSE RIGHT([To PN],2) END Tier
FROM mytable c
WHERE ([From PT] = 'DRIVER' OR [To PT] = 'DRIVER')
) a ) b ) c
GROUP BY dateadd(minute,(datediff(minute,0,Time)/15)*15,0),  AREA, CARS) src pivot(CONCAT(sum(BLOBs),CARs) for AREA in ([02],[06],[10])) piv;

Если я изменю свою вторую строку на (Удаление CARs):

SELECT dateadd(minute,(datediff(minute,0,Time)/15)*15,0) Time,  AREA, COUNT(BLOB) BLOBs

И если я изменю свой GROUP BY на (Удаление CARs и CONCAT функция):

GROUP BY dateadd(minute,(datediff(minute,0,Time)/15)*15,0),  AREA) src pivot(sum(BLOBs) for AREA in ([02],[06],[10])) piv;

Это работает, но ятребуется объединение результатов.

Текущий рабочий вывод:

Time                      02    06      10
2018-05-07 16:00:00.000   11    NULL    NULL
2018-05-07 16:15:00.000   2     7       NULL
2018-05-07 16:30:00.000   NULL  8       NULL
2018-05-07 16:45:00.000   9     NULL    NULL
2018-05-07 17:00:00.000   9     NULL    8

Ожидаемый вывод (с CONCAT):

Time                      02        06      10
2018-05-07 16:00:00.000   BMW11     NULL    NULL
2018-05-07 16:15:00.000   BMW2      KIA7    NULL
2018-05-07 16:30:00.000   NULL      KIA8    NULL
2018-05-07 16:45:00.000   BMW9      NULL    NULL
2018-05-07 17:00:00.000   BMW9      NULL    FIAT8

Пример данных из запроса,без PIVOT:

Time                        AREA    BLOBs   CARs
2018-05-07 16:00:00.000     02      11      BMW
2018-05-07 16:15:00.000     02      2       BMW
2018-05-07 16:15:00.000     06      7       KIA
2018-05-07 16:30:00.000     06      8       KIA
2018-05-07 16:45:00.000     02      9       BMW
2018-05-07 17:00:00.000     02      9       BMW
2018-05-07 17:00:00.000     10      8       FIAT

Необработанные данные выборки из таблицы:

Ответы [ 2 ]

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

Попробуйте это,

CREATE TABLE #PIVOT (Time  DATETIME, AREA INT, BLOBs INT, CARs VARChar (10))

insert into #PIVOT values 
 ('2018-05-07 16:00:00.000', 02, 11     ,'BMW')
,('2018-05-07 16:15:00.000', 02, 2      ,'BMW')
,('2018-05-07 16:15:00.000', 06, 7      ,'KIA')
,('2018-05-07 16:30:00.000', 06, 8      ,'KIA')
,('2018-05-07 16:45:00.000', 02, 9      ,'BMW')
,('2018-05-07 17:00:00.000', 02, 9      ,'BMW')
,('2018-05-07 17:00:00.000', 10, 8      ,'FIA')


select
 Time, CARs + convert (varchar (10), [02]) [02]
 , CARs + convert (varchar (10), [06]) [06], CARs + convert (varchar (10), [10]) [10]
from (
 select
 *
 from #PIVOT
) p
pivot
(
max (BLOBs) for area in ([02],[06], [10])
) t

Time                        02      06      10
2018-05-07 16:00:00.000     BMW11   NULL    NULL
2018-05-07 16:15:00.000     BMW2    NULL    NULL
2018-05-07 16:45:00.000     BMW9    NULL    NULL
2018-05-07 17:00:00.000     BMW9    NULL    NULL
2018-05-07 17:00:00.000     NULL    NULL    FIA8
2018-05-07 16:15:00.000     NULL    KIA7    NULL
2018-05-07 16:30:00.000     NULL    KIA8    NULL

Позвольте мне работать с динамическим запросом.

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

Вы можете попробовать ниже - вам нужно использовать агрегатную функцию в сводной таблице, так что в вашем случае вы можете использовать max(CONCAT(sum(BLOBs),CARs))

    SELECT * FROM (
SELECT dateadd(minute,(datediff(minute,0,Time)/15)*15,0) Time,  AREA, COUNT(BLOB) BLOBs, CARS
FROM 
(SELECT BLOB, Time, CARS, DRIVER, [MK], AREA, Tier FROM (
SELECT [BLOB Nbr] BLOB, Time, CARS, [From PT], [To PT], [From PN], [To PN], DRIVER, [MK],
CASE AREA
WHEN '01' THEN '02' WHEN '03' THEN '02'
WHEN '05' THEN '06' WHEN '07' THEN '06'
WHEN '09' THEN '10' WHEN '11' THEN '10'
ELSE AREA END AREA, 
Position, Tier
FROM (
SELECT [BLOB Nbr], T_IME Time, [C NAME] CARS, [From PT], [To PT], [From PN], [To PN], [C V] DRIVER, [MK],
CASE WHEN [From PT] = 'DRIVER' THEN LEFT(RIGHT([From PN],6),2) ELSE LEFT(RIGHT([To PN],6),2) END AREA,
CASE WHEN [From PT] = 'DRIVER' THEN LEFT(RIGHT([From PN],4),2) ELSE LEFT(RIGHT([To PN],4),2) END Position,
CASE WHEN [From PT] = 'DRIVER' THEN RIGHT([From PN],2) ELSE RIGHT([To PN],2) END Tier
FROM mytable c
WHERE ([From PT] = 'DRIVER' OR [To PT] = 'DRIVER')
) a ) b ) c
GROUP BY dateadd(minute,(datediff(minute,0,Time)/15)*15,0),  AREA, CARS) src pivot(max(CONCAT(sum(BLOBs),CARs)) for AREA in ([02],[06],[10])) piv;
...