简体   繁体   English

雪花 SQL 语句 Pivot 不适用于我正在使用的查询

[英]Snowflake SQL Statement Pivot will not work with query I am using

Below is the Snowflake query.下面是雪花查询。 I know it is ugly but it is what I have to work with here.我知道这很丑陋,但这是我必须在这里工作的。 The problem is my PIVOT isn't working.问题是我的 PIVOT 不工作。 Everything up to that point works but when I try the Pivot I get an error: invalid identifier 'DRIVERTYPE'.到目前为止一切正常,但是当我尝试 Pivot 时,我收到一个错误:无效标识符“DRIVERTYPE”。 I need to transpose my results to turn rows into columns based on the DriverType.我需要转置我的结果以根据 DriverType 将行转换为列。

SELECT CSC, DRIVERTYPE, TEN_MONTHS_TURNOVER FROM 
(
  -- Beginning of Year (Driver Count):
  SELECT 
      CASE
        WHEN A.CSC = 'ABI' THEN 'Abilene'
        WHEN A.CSC = 'ALB' THEN 'Albuquerque'
        WHEN A.CSC = 'AMA' THEN 'Amarillo'
        WHEN A.CSC = 'BOV' THEN 'Bovina'
        WHEN A.CSC = 'DFW' THEN 'Dallas / Fort Worth'
        WHEN A.CSC = 'ELP' THEN 'El Paso'
        WHEN A.CSC = 'HOU' THEN 'Houston'
        WHEN A.CSC = 'ODE' THEN 'Odessa'
        WHEN A.CSC = 'OKC' THEN 'Oklahoma City'
        WHEN A.CSC = 'PHO' THEN 'Phoenix'
        WHEN A.CSC = 'SAN' THEN 'San Antonio'
        WHEN A.CSC = 'TOP' THEN 'Topeka'
        WHEN A.CSC = 'TUL' THEN 'Tulsa'
        WHEN A.CSC = 'WIC' THEN 'Wichita'
      END AS CSC, 
      CASE
        WHEN A.DRIVERTYPE = 'CD' THEN 'Company Driver'
        WHEN A.DRIVERTYPE = 'LO' THEN 'Independent Contractor'
      END AS DRIVERTYPE,
      A.DRIVER_COUNT_BEG_YR, B.YTD_HIRED_DRIVERS, C.YTD_TERMED_DRIVERS, D.DRIVER_COUNT_END_MO, 
      ROUND((A.DRIVER_COUNT_BEG_YR + D.DRIVER_COUNT_END_MO) / 2) AS AVG_DRIVER_COUNT, ROUND(C.YTD_TERMED_DRIVERS / AVG_DRIVER_COUNT, 4) AS TEN_MONTHS_TURNOVER,
      ROUND(TEN_MONTHS_TURNOVER / 10, 4) AS MONTHLY_TURNOVER, ROUND(TEN_MONTHS_TURNOVER * 12 / 10, 4) AS ANNUALIZED_TURNOVER, 
      ROUND(C.YTD_TERMED_DRIVERS / (A.DRIVER_COUNT_BEG_YR + B.YTD_HIRED_DRIVERS) * 1, 4) AS TURNOVER,
      G.COUNTS AS EOY_FORECAST_COUNTS, +EOY_FORECAST_COUNTS - D.DRIVER_COUNT_END_MO AS NEED_TO_HIRE, E.RANGE_HIRED_DRIVERS, F.RANGE_TERMED_DRIVERS
  FROM
  (
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS DRIVER_COUNT_BEG_YR 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_HIREDATE,1,4) < SUBSTRING(CURRENT_DATE(),1,4) 
        AND SUBSTRING(MPP_TERMINATIONDT,1,4) >= SUBSTRING(CURRENT_DATE(),1,4) 
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) A
  LEFT JOIN
  (
  -- Year to Date (Hired Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS YTD_HIRED_DRIVERS 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_HIREDATE,1,4) = SUBSTRING(CURRENT_DATE(),1,4) 
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) B ON A.CSC = B.CSC AND A.DRIVERTYPE = B.DRIVERTYPE
  LEFT JOIN
  (
  -- Year to Date (Termed Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS YTD_TERMED_DRIVERS
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_TERMINATIONDT,1,4) = SUBSTRING(CURRENT_DATE(),1,4)
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) C ON A.CSC = C.CSC AND A.DRIVERTYPE = C.DRIVERTYPE
  LEFT JOIN
  (
  -- End of Month (Driver Count):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS DRIVER_COUNT_END_MO--, Forecast_Counts 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_HIREDATE,1,4) <= SUBSTRING(CURRENT_DATE(),1,4) AND SUBSTRING(MPP_HIREDATE,6,2) <= SUBSTRING(CURRENT_DATE(),6,2)
        AND SUBSTRING(MPP_TERMINATIONDT,1,4) >= SUBSTRING(CURRENT_DATE(),1,4) AND SUBSTRING(MPP_TERMINATIONDT,6,2) > SUBSTRING(CURRENT_DATE(),6,2)
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) D ON A.CSC = D.CSC AND A.DRIVERTYPE = D.DRIVERTYPE
  LEFT JOIN
  (
  -- Montly/Date Range (Hired Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS RANGE_HIRED_DRIVERS 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE MPP_HIREDATE BETWEEN '2022-07-01' AND '2022-07-31'
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
      ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) E ON A.CSC = E.CSC AND A.DRIVERTYPE = E.DRIVERTYPE
  LEFT JOIN
  (
  -- Montly/Date Range (Termed Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS RANGE_TERMED_DRIVERS
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE MPP_TERMINATIONDT BETWEEN '2022-07-01' AND '2022-07-31' 
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
      ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) F ON A.CSC = F.CSC AND A.DRIVERTYPE = F.DRIVERTYPE
  INNER JOIN "DEV"."PUBLIC"."TMW_DRIVERFORECAST" G ON A.CSC = G.CSC   -- AND A.DRIVERTYPE = E.DRIVERTYPE
  WHERE SUBSTRING(MONTH,1,4) = SUBSTRING(CURRENT_DATE(),1,4) AND SUBSTRING(MONTH,6,2) = 12 /* End of Current Year Forecast */


  ----------------------------------------------------------------------------------------------------------------
  -- (Works 3rd Graph) Sub-Total Line Grouping and % Formulas (to get correct Percentages):
  ----------------------------------------------------------------------------------------------------------------
  UNION 

  -- Beginning of Year (Driver Count):
  SELECT  
      CASE
        WHEN A.CSC = 'ABI' THEN 'Abilene'
        WHEN A.CSC = 'ALB' THEN 'Albuquerque'
        WHEN A.CSC = 'AMA' THEN 'Amarillo'
        WHEN A.CSC = 'BOV' THEN 'Bovina'
        WHEN A.CSC = 'DFW' THEN 'Dallas / Fort Worth'
        WHEN A.CSC = 'ELP' THEN 'El Paso'
        WHEN A.CSC = 'HOU' THEN 'Houston'
        WHEN A.CSC = 'ODE' THEN 'Odessa'
        WHEN A.CSC = 'OKC' THEN 'Oklahoma City'
        WHEN A.CSC = 'PHO' THEN 'Phoenix'
        WHEN A.CSC = 'SAN' THEN 'San Antonio'
        WHEN A.CSC = 'TOP' THEN 'Topeka'
        WHEN A.CSC = 'TUL' THEN 'Tulsa'
        WHEN A.CSC = 'WIC' THEN 'Wichita'
      END AS CSC, 
      'Total' AS DRIVERTYPE, --A.DRIVERTYPE, 
      SUM(A.DRIVER_COUNT_BEG_YR) AS DRIVER_COUNT_BEG_YR, SUM(B.YTD_HIRED_DRIVERS) AS YTD_HIRED_DRIVERS, 
      SUM(C.YTD_TERMED_DRIVERS) AS YTD_TERMED_DRIVERS, SUM(D.DRIVER_COUNT_END_MO) AS DRIVER_COUNT_END_MO, 
      SUM(ROUND((A.DRIVER_COUNT_BEG_YR + D.DRIVER_COUNT_END_MO) / 2)) AS AVG_DRIVER_COUNT, 
      ROUND(SUM(C.YTD_TERMED_DRIVERS) / AVG_DRIVER_COUNT, 4) AS TEN_MONTHS_TURNOVER,
      ROUND(TEN_MONTHS_TURNOVER / 10, 4) AS MONTHLY_TURNOVER, ROUND(TEN_MONTHS_TURNOVER * 12 / 10, 4) AS ANNUALIZED_TURNOVER, 
      ROUND(SUM(C.YTD_TERMED_DRIVERS) / (SUM(A.DRIVER_COUNT_BEG_YR) + SUM(B.YTD_HIRED_DRIVERS)) * 1, 4) AS TURNOVER,
      SUM(G.COUNTS) AS EOY_FORECAST_COUNTS, +EOY_FORECAST_COUNTS - SUM(D.DRIVER_COUNT_END_MO) AS NEED_TO_HIRE, 
      SUM(E.RANGE_HIRED_DRIVERS) AS RANGE_HIRED_DRIVERS, SUM(F.RANGE_TERMED_DRIVERS) AS RANGE_TERMED_DRIVERS
  FROM
  (
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS DRIVER_COUNT_BEG_YR 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_HIREDATE,1,4) < SUBSTRING(CURRENT_DATE(),1,4) 
        AND SUBSTRING(MPP_TERMINATIONDT,1,4) >= SUBSTRING(CURRENT_DATE(),1,4) 
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) A
  LEFT JOIN
  (
  -- Year to Date (Hired Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS YTD_HIRED_DRIVERS 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_HIREDATE,1,4) = SUBSTRING(CURRENT_DATE(),1,4) 
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) B ON A.CSC = B.CSC AND A.DRIVERTYPE = B.DRIVERTYPE
  LEFT JOIN
  (
  -- Year to Date (Termed Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS YTD_TERMED_DRIVERS
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_TERMINATIONDT,1,4) = SUBSTRING(CURRENT_DATE(),1,4)
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) C ON A.CSC = C.CSC AND A.DRIVERTYPE = C.DRIVERTYPE
  LEFT JOIN
  (
  -- End of Month (Driver Count):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS DRIVER_COUNT_END_MO--, Forecast_Counts 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE SUBSTRING(MPP_HIREDATE,1,4) <= SUBSTRING(CURRENT_DATE(),1,4) AND SUBSTRING(MPP_HIREDATE,6,2) <= SUBSTRING(CURRENT_DATE(),6,2)
        AND SUBSTRING(MPP_TERMINATIONDT,1,4) >= SUBSTRING(CURRENT_DATE(),1,4) AND SUBSTRING(MPP_TERMINATIONDT,6,2) > SUBSTRING(CURRENT_DATE(),6,2)
        AND MPP_TYPE1 IN ('CD', 'LO')   /* CD is Company Driver?, LO is Independent Contractor? */
        ORDER BY MPP_TERMINAL, MPP_TYPE1
       ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) D ON A.CSC = D.CSC AND A.DRIVERTYPE = D.DRIVERTYPE
  LEFT JOIN
  (
  -- Monthly/Date Range (Hired Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS RANGE_HIRED_DRIVERS 
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE MPP_HIREDATE BETWEEN '2022-07-01' AND '2022-07-31'
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
      ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) E ON A.CSC = E.CSC AND A.DRIVERTYPE = E.DRIVERTYPE
  LEFT JOIN
  (
  -- Monthly/Date Range (Termed Drivers):
  SELECT MPP_Terminal AS CSC, MPP_Type1 AS DRIVERTYPE, COUNT(MPP_TERMINAL) AS RANGE_TERMED_DRIVERS
  FROM (
        SELECT MPP_Terminal, /* <-- is Join to CSC */
        MPP_Status, 
        MPP_Type1,
        MPP_HireDate,
        MPP_TerminationDT
        FROM "DEV"."PUBLIC"."TMW_MANPOWERPROFILE" 
        WHERE MPP_TERMINATIONDT BETWEEN '2022-07-01' AND '2022-07-31'
        AND MPP_TYPE1 IN ('CD', 'LO')   
        ORDER BY MPP_TERMINAL, MPP_TYPE1
      ) 
  GROUP BY MPP_TERMINAL, MPP_TYPE1
  ORDER BY  MPP_TERMINAL, MPP_TYPE1
  ) F ON A.CSC = F.CSC AND A.DRIVERTYPE = F.DRIVERTYPE
  INNER JOIN "DEV"."PUBLIC"."TMW_DRIVERFORECAST" G ON A.CSC = G.CSC   -- AND A.DRIVERTYPE = G.DRIVERTYPE
  WHERE SUBSTRING(MONTH,1,4) = SUBSTRING(CURRENT_DATE(),1,4) AND SUBSTRING(MONTH,6,2) = 12 /* End of Current Year Forecast */
  GROUP BY A.CSC --,A.DRIVERTYPE
  ORDER BY CSC, DRIVERTYPE
) H 
PIVOT (
  AVG(TEN_MONTHS_TURNOVER) FOR DRIVERTYPE IN ('Company Driver', 'Independent Contractor', 'Total')
) AS PivotTable

Below is how the data looks from everything up to the Pivot:以下是从 Pivot 到 Pivot 的数据:

在此处输入图像描述

I am guessing this is an Alias issue.我猜这是一个别名问题。 I tried doing the top level select with an Alias and using that but no luck.我尝试使用别名做顶级 select 并使用它但没有运气。 Also tried A.VarNames, up to H.VarNames but still get the error when trying to use Pivot.还尝试了 A.VarNames,直到 H.VarNames,但在尝试使用 Pivot 时仍然出现错误。 I am open to other ways to get this done.我愿意接受其他方式来完成这项工作。 Would like to see some examples in the answers please.想看看答案中的一些例子。

Since I don't have your base tables and you indicated the majority of the query works, I wrote a simple test using WITH which provided a pivoted result set.由于我没有您的基表并且您指出大部分查询都有效,因此我使用 WITH 编写了一个简单的测试,该测试提供了一个透视结果集。

WITH PT (CSC, DRIVERTYPE, TEN_MONTHS_TURNOVER) AS (
        select
            $1 as CSC,
            $2 as DRIVERTYPE,
            $3 as TEN_MONTHS_TURNOVER
        from
            (
                values
                    ('Abilene', 'Company Driver', 0.125),('Abilene', 'Independent Contractor', 0.125),('Abilene', 'Total', 0.125)
            )
    )
SELECT
    *
FROM
    PT 
    PIVOT (
        AVG(TEN_MONTHS_TURNOVER) FOR DRIVERTYPE IN (
            'Company Driver',
            'Independent Contractor',
            'Total'
        )
    ) as P;

So, applied it to your query - please see if this works for you:因此,将其应用于您的查询 - 请查看这是否适合您:

WITH PT (CSC, DRIVERTYPE, TEN_MONTHS_TURNOVER) AS (
    SELECT
        CSC,
        DRIVERTYPE,
        TEN_MONTHS_TURNOVER
    FROM
        (
            -- Beginning of Year (Driver Count):
            SELECT
                CASE
                    WHEN A.CSC = 'ABI' THEN 'Abilene'
                    WHEN A.CSC = 'ALB' THEN 'Albuquerque'
                    WHEN A.CSC = 'AMA' THEN 'Amarillo'
                    WHEN A.CSC = 'BOV' THEN 'Bovina'
                    WHEN A.CSC = 'DFW' THEN 'Dallas / Fort Worth'
                    WHEN A.CSC = 'ELP' THEN 'El Paso'
                    WHEN A.CSC = 'HOU' THEN 'Houston'
                    WHEN A.CSC = 'ODE' THEN 'Odessa'
                    WHEN A.CSC = 'OKC' THEN 'Oklahoma City'
                    WHEN A.CSC = 'PHO' THEN 'Phoenix'
                    WHEN A.CSC = 'SAN' THEN 'San Antonio'
                    WHEN A.CSC = 'TOP' THEN 'Topeka'
                    WHEN A.CSC = 'TUL' THEN 'Tulsa'
                    WHEN A.CSC = 'WIC' THEN 'Wichita'
                END AS CSC,
                CASE
                    WHEN A.DRIVERTYPE = 'CD' THEN 'Company Driver'
                    WHEN A.DRIVERTYPE = 'LO' THEN 'Independent Contractor'
                END AS DRIVERTYPE,
                A.DRIVER_COUNT_BEG_YR,
                B.YTD_HIRED_DRIVERS,
                C.YTD_TERMED_DRIVERS,
                D.DRIVER_COUNT_END_MO,
                ROUND(
                    (A.DRIVER_COUNT_BEG_YR + D.DRIVER_COUNT_END_MO) / 2
                ) AS AVG_DRIVER_COUNT,
                ROUND(C.YTD_TERMED_DRIVERS / AVG_DRIVER_COUNT, 4) AS TEN_MONTHS_TURNOVER,
                ROUND(TEN_MONTHS_TURNOVER / 10, 4) AS MONTHLY_TURNOVER,
                ROUND(TEN_MONTHS_TURNOVER * 12 / 10, 4) AS ANNUALIZED_TURNOVER,
                ROUND(
                    C.YTD_TERMED_DRIVERS / (A.DRIVER_COUNT_BEG_YR + B.YTD_HIRED_DRIVERS) * 1,
                    4
                ) AS TURNOVER,
                G.COUNTS AS EOY_FORECAST_COUNTS,
                + EOY_FORECAST_COUNTS - D.DRIVER_COUNT_END_MO AS NEED_TO_HIRE,
                E.RANGE_HIRED_DRIVERS,
                F.RANGE_TERMED_DRIVERS
            FROM
                (
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS DRIVER_COUNT_BEG_YR
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_HIREDATE, 1, 4) < SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND SUBSTRING(MPP_TERMINATIONDT, 1, 4) >= SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) A
                LEFT JOIN (
                    -- Year to Date (Hired Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS YTD_HIRED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_HIREDATE, 1, 4) = SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) B ON A.CSC = B.CSC
                AND A.DRIVERTYPE = B.DRIVERTYPE
                LEFT JOIN (
                    -- Year to Date (Termed Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS YTD_TERMED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_TERMINATIONDT, 1, 4) = SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) C ON A.CSC = C.CSC
                AND A.DRIVERTYPE = C.DRIVERTYPE
                LEFT JOIN (
                    -- End of Month (Driver Count):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS DRIVER_COUNT_END_MO --, Forecast_Counts
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_HIREDATE, 1, 4) <= SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND SUBSTRING(MPP_HIREDATE, 6, 2) <= SUBSTRING(CURRENT_DATE(), 6, 2)
                                AND SUBSTRING(MPP_TERMINATIONDT, 1, 4) >= SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND SUBSTRING(MPP_TERMINATIONDT, 6, 2) > SUBSTRING(CURRENT_DATE(), 6, 2)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) D ON A.CSC = D.CSC
                AND A.DRIVERTYPE = D.DRIVERTYPE
                LEFT JOIN (
                    -- Montly/Date Range (Hired Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS RANGE_HIRED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                MPP_HIREDATE BETWEEN '2022-07-01'
                                AND '2022-07-31'
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) E ON A.CSC = E.CSC
                AND A.DRIVERTYPE = E.DRIVERTYPE
                LEFT JOIN (
                    -- Montly/Date Range (Termed Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS RANGE_TERMED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                MPP_TERMINATIONDT BETWEEN '2022-07-01'
                                AND '2022-07-31'
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) F ON A.CSC = F.CSC
                AND A.DRIVERTYPE = F.DRIVERTYPE
                INNER JOIN "DEV"."PUBLIC"."TMW_DRIVERFORECAST" G ON A.CSC = G.CSC -- AND A.DRIVERTYPE = E.DRIVERTYPE
            WHERE
                SUBSTRING(MONTH, 1, 4) = SUBSTRING(CURRENT_DATE(), 1, 4)
                AND SUBSTRING(MONTH, 6, 2) = 12
                /* End of Current Year Forecast */
                ----------------------------------------------------------------------------------------------------------------
                -- (Works 3rd Graph) Sub-Total Line Grouping and % Formulas (to get correct Percentages):
                ----------------------------------------------------------------------------------------------------------------
            UNION
                -- Beginning of Year (Driver Count):
            SELECT
                CASE
                    WHEN A.CSC = 'ABI' THEN 'Abilene'
                    WHEN A.CSC = 'ALB' THEN 'Albuquerque'
                    WHEN A.CSC = 'AMA' THEN 'Amarillo'
                    WHEN A.CSC = 'BOV' THEN 'Bovina'
                    WHEN A.CSC = 'DFW' THEN 'Dallas / Fort Worth'
                    WHEN A.CSC = 'ELP' THEN 'El Paso'
                    WHEN A.CSC = 'HOU' THEN 'Houston'
                    WHEN A.CSC = 'ODE' THEN 'Odessa'
                    WHEN A.CSC = 'OKC' THEN 'Oklahoma City'
                    WHEN A.CSC = 'PHO' THEN 'Phoenix'
                    WHEN A.CSC = 'SAN' THEN 'San Antonio'
                    WHEN A.CSC = 'TOP' THEN 'Topeka'
                    WHEN A.CSC = 'TUL' THEN 'Tulsa'
                    WHEN A.CSC = 'WIC' THEN 'Wichita'
                END AS CSC,
                'Total' AS DRIVERTYPE,
                --A.DRIVERTYPE,
                SUM(A.DRIVER_COUNT_BEG_YR) AS DRIVER_COUNT_BEG_YR,
                SUM(B.YTD_HIRED_DRIVERS) AS YTD_HIRED_DRIVERS,
                SUM(C.YTD_TERMED_DRIVERS) AS YTD_TERMED_DRIVERS,
                SUM(D.DRIVER_COUNT_END_MO) AS DRIVER_COUNT_END_MO,
                SUM(
                    ROUND(
                        (A.DRIVER_COUNT_BEG_YR + D.DRIVER_COUNT_END_MO) / 2
                    )
                ) AS AVG_DRIVER_COUNT,
                ROUND(SUM(C.YTD_TERMED_DRIVERS) / AVG_DRIVER_COUNT, 4) AS TEN_MONTHS_TURNOVER,
                ROUND(TEN_MONTHS_TURNOVER / 10, 4) AS MONTHLY_TURNOVER,
                ROUND(TEN_MONTHS_TURNOVER * 12 / 10, 4) AS ANNUALIZED_TURNOVER,
                ROUND(
                    SUM(C.YTD_TERMED_DRIVERS) / (
                        SUM(A.DRIVER_COUNT_BEG_YR) + SUM(B.YTD_HIRED_DRIVERS)
                    ) * 1,
                    4
                ) AS TURNOVER,
                SUM(G.COUNTS) AS EOY_FORECAST_COUNTS,
                + EOY_FORECAST_COUNTS - SUM(D.DRIVER_COUNT_END_MO) AS NEED_TO_HIRE,
                SUM(E.RANGE_HIRED_DRIVERS) AS RANGE_HIRED_DRIVERS,
                SUM(F.RANGE_TERMED_DRIVERS) AS RANGE_TERMED_DRIVERS
            FROM
                (
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS DRIVER_COUNT_BEG_YR
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_HIREDATE, 1, 4) < SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND SUBSTRING(MPP_TERMINATIONDT, 1, 4) >= SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) A
                LEFT JOIN (
                    -- Year to Date (Hired Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS YTD_HIRED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_HIREDATE, 1, 4) = SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) B ON A.CSC = B.CSC
                AND A.DRIVERTYPE = B.DRIVERTYPE
                LEFT JOIN (
                    -- Year to Date (Termed Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS YTD_TERMED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_TERMINATIONDT, 1, 4) = SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) C ON A.CSC = C.CSC
                AND A.DRIVERTYPE = C.DRIVERTYPE
                LEFT JOIN (
                    -- End of Month (Driver Count):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS DRIVER_COUNT_END_MO --, Forecast_Counts
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                SUBSTRING(MPP_HIREDATE, 1, 4) <= SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND SUBSTRING(MPP_HIREDATE, 6, 2) <= SUBSTRING(CURRENT_DATE(), 6, 2)
                                AND SUBSTRING(MPP_TERMINATIONDT, 1, 4) >= SUBSTRING(CURRENT_DATE(), 1, 4)
                                AND SUBSTRING(MPP_TERMINATIONDT, 6, 2) > SUBSTRING(CURRENT_DATE(), 6, 2)
                                AND MPP_TYPE1 IN ('CD', 'LO')
                                /* CD is Company Driver?, LO is Independent Contractor? */
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) D ON A.CSC = D.CSC
                AND A.DRIVERTYPE = D.DRIVERTYPE
                LEFT JOIN (
                    -- Monthly/Date Range (Hired Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS RANGE_HIRED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                MPP_HIREDATE BETWEEN '2022-07-01'
                                AND '2022-07-31'
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) E ON A.CSC = E.CSC
                AND A.DRIVERTYPE = E.DRIVERTYPE
                LEFT JOIN (
                    -- Monthly/Date Range (Termed Drivers):
                    SELECT
                        MPP_Terminal AS CSC,
                        MPP_Type1 AS DRIVERTYPE,
                        COUNT(MPP_TERMINAL) AS RANGE_TERMED_DRIVERS
                    FROM
                        (
                            SELECT
                                MPP_Terminal,
                                /* <-- is Join to CSC */
                                MPP_Status,
                                MPP_Type1,
                                MPP_HireDate,
                                MPP_TerminationDT
                            FROM
                                "DEV"."PUBLIC"."TMW_MANPOWERPROFILE"
                            WHERE
                                MPP_TERMINATIONDT BETWEEN '2022-07-01'
                                AND '2022-07-31'
                                AND MPP_TYPE1 IN ('CD', 'LO')
                            ORDER BY
                                MPP_TERMINAL,
                                MPP_TYPE1
                        )
                    GROUP BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                    ORDER BY
                        MPP_TERMINAL,
                        MPP_TYPE1
                ) F ON A.CSC = F.CSC
                AND A.DRIVERTYPE = F.DRIVERTYPE
                INNER JOIN "DEV"."PUBLIC"."TMW_DRIVERFORECAST" G ON A.CSC = G.CSC -- AND A.DRIVERTYPE = G.DRIVERTYPE
            WHERE
                SUBSTRING(MONTH, 1, 4) = SUBSTRING(CURRENT_DATE(), 1, 4)
                AND SUBSTRING(MONTH, 6, 2) = 12
                /* End of Current Year Forecast */
            GROUP BY
                A.CSC --,A.DRIVERTYPE
            ORDER BY
                CSC,
                DRIVERTYPE
        )
)
SELECT
   *
FROM
    PT PIVOT (
        AVG(TEN_MONTHS_TURNOVER) FOR DRIVERTYPE IN (
            'Company Driver',
            'Independent Contractor',
            'Total'
        )
    ) AS PivotTable;

Compressing your query to this:将您的查询压缩为此:

SELECT CSC, DRIVERTYPE, TEN_MONTHS_TURNOVER FROM 
(
    ⋯
) H 
PIVOT (
  AVG(TEN_MONTHS_TURNOVER) FOR DRIVERTYPE IN ('Company Driver', 'Independent Contractor', 'Total')
) AS PivotTable

implies a disconnect between the result set columns and the pivot.意味着结果集列和 pivot 之间断开连接。 You may find something like this more workable:你可能会发现这样的东西更可行:

SELECT *
(
    ⋯
) H 
PIVOT (
  AVG(TEN_MONTHS_TURNOVER) FOR DRIVERTYPE IN ('Company Driver', 'Independent Contractor', 'Total')
) AS PivotTable

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM