代码之家  ›  专栏  ›  技术社区  ›  Matt

在pivot聚合函数中使用CONCAT函数时发生SQL Server错误

  •  1
  • Matt  · 技术社区  · 7 年前

    我想做的是添加一个 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 汽车 海螺 功能):

    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
    

    ):

    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 回复  |  直到 7 年前
        1
  •  1
  •   Ranjith    7 年前

    试试这个,

    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
    

        2
  •  1
  •   Matt    7 年前

    您可以在下面尝试—您需要在pivot中使用聚合函数,以便在您的情况下可以使用 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;