Почему я получаю синтаксическую ошибку при использовании сводки SQL? - PullRequest
0 голосов
/ 28 мая 2019

Я получаю синтаксическую ошибку в 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 году.

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

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

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
0 голосов
/ 28 мая 2019

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

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

например,

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 - Что общего между BETWEEN и дьяволом?
  2. Используйте недвусмысленный литеральный формат даты yyyyMMdd, в зависимости от ваших настроек 2018-10-01 может быть либо 10 января, либо 1 октября.

Таким образом, вы получитес:

   WHERE SampleStart >= '20180101' 
   AND SampleStart < '20190101'
...