Я получаю синтаксическую ошибку в 1 января.

Мой SampleStart в формате datetime. Я намекаю что-то не так?

SELECT * FROM (
  SELECT year(SampleStart) year, month(SampleStart) month, AllowedPopulation
  FROM BIC_AGGREGATE_FINAL
  WHERE SampleStart BETWEEN '2018-01-01' AND '2018-12-31'
) as s
PIVOT (
  max(AllowedPopulation) 
  FOR month in (
    1 JAN, 2 FEB, 3 MAR, 4 APR, 5 MAY, 6 JUN,
    7 JUL, 8 AUG, 9 SEP, 10 OCT, 11 NOV, 12 DEC
  )
)
ORDER BY year DESC

Я ожидаю, что результаты покажут мне разрешенное население для каждого месяца в 2018 году.

0
Tolerator 28 Май 2019 в 18:41

2 ответа

Лучший ответ

Вы не можете предоставить псевдонимы столбцов в функции pivot, вы должны сделать это в select. Кроме того, при указании выражения IN в сводной области вы должны применять аналогичные правила при выборе столбцов, если столбец является зарезервированным словом или содержит специальные символы (например, пробел), или начинается с числа и т. Д., То вы должны заключите имя в квадратные скобки.

Наконец, вы должны дать псевдониму самой функции pivot.

Например

SELECT  pvt.[year],
        JAN = pvt.[1],
        FEB = pvt.[2],
        MAR = pvt.[3],
        APR = pvt.[4],
        MAY = pvt.[5],
        JUN = pvt.[6],
        JUL = pvt.[7],
        AUG = pvt.[8],
        SEP = pvt.[9],
        OCT = pvt.[10],
        NOV = pvt.[11],
        DEC = pvt.[12]
FROM (
  SELECT YEAR(SampleStart) AS [year], MONTH(SampleStart) AS [month], AllowedPopulation
  FROM BIC_AGGREGATE_FINAL
  WHERE SampleStart BETWEEN '2018-01-01' AND '2018-12-31'
) AS s
PIVOT (
  MAX(AllowedPopulation) 
  FOR month IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) 
) AS pvt -- Alias here too
ORDER BY pvt.[year] DESC

Если, поскольку вопрос гласит, что SampleStart является столбцом DATETIME, я бы сделал два изменения в предложении where:

  1. Используйте исключительный диапазон дат вместо BETWEEN - Что общего между МЕЖДУ и дьяволом?
  2. Используйте однозначный формат литерала даты yyyyMMdd, в зависимости от ваших настроек 2018-10-01 может быть либо 10 января, либо 1 октября.

Таким образом, вы бы в конечном итоге:

   WHERE SampleStart >= '20180101' 
   AND SampleStart < '20190101'
0
GarethD 28 Май 2019 в 16:01

Попробуйте с-

SELECT  year,
[1] AS JAN,
[2] AS FEB,
[3] AS MAR,
[4] AS APR,
[5] AS MAY,
[6] AS JUN,
[7] AS JUL,
[8] AS AUG,
[9] AS SEP,
[10] AS OCT,
[11] AS NOV,
[12] AS DEC


FROM 
(
    SELECT year(SampleStart) year, 
    month(SampleStart) month, 
    AllowedPopulation
    FROM BIC_AGGREGATE_FINAL
    WHERE SampleStart BETWEEN '2018-01-01' AND '2018-12-31'
) as s
PIVOT 
(
max(AllowedPopulation) 
FOR month in (
    [1], [2], [3], [4], [5], [6],
    [7], [8], [9], [10], [11], [12]
)
)AS PVT
ORDER BY year DESC
2
mkRabbani 28 Май 2019 в 15:57
56345748