Access ошибка transform

Hells Korzhik

0 / 0 / 0

Регистрация: 24.05.2018

Сообщений: 11

1

20.03.2020, 19:05. Показов 3592. Ответов 6

Метки microsoft access (Все метки)


Студворк — интернет-сервис помощи студентам

Всем доброго дня.
Возникла такая задача-проблема: необходимо сделать перекрестный запрос отображающий по отделам количество сотрудников родившихся в каждом месяце и за весь год. В целом мне понятна конструкция запроса — но совершенно ничего не выходит и даже идей нет, как несложно догадаться я начинающий)
Код

SQL
1
2
3
4
5
6
7
8
TRANSFORM Coun tFormat(DATA,"mmmm") AS [Sum-Количество]
SELECT Фамилия, COUNT(Сотрудники.дата_рождения) AS ГОД, Format([Дата_рождения],"mm")
 IN ("янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек")
 
FROM Сотрудники INNER JOIN Дата2 ON Сотрудники.Дата_рождения = Дата2.Месяц
WHERE Дата_рождения Format(DATA,"mmmm");
GROUP BY Сотрудники.Дата_рождения
PIVOT Сотрудники.Фамилия;

Миниатюры

Перекрестный запрос Microsoft Access
 



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

20.03.2020, 19:05

6

Eugene-LS

Заблокирован

20.03.2020, 19:22

2

Цитата
Сообщение от Hells Korzhik
Посмотреть сообщение

сделать перекрестный запрос отображающий по отделам количество сотрудников родившихся в каждом месяце и за весь год

Если так, то при чём тогда «PIVOT Сотрудники.Фамилия» ?
Нужно же: «по отделам количество сотрудников» … — не понятно.

И что за табличка у вас в «Дата2» ?
судя по : INNER JOIN Дата2 ON …

Нарисуйте то что вы хотите получить в начале (лучше в формате nxn) — подумаем.
У вас в поле Дата_рождения что забито ? текст — число?



0



mobile

Эксперт MS Access

26784 / 14463 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

20.03.2020, 19:29

3

Лучший ответ Сообщение было отмечено ltv_1953 как решение

Решение

Цитата
Сообщение от Hells Korzhik
Посмотреть сообщение

перекрестный запрос отображающий по отделам количество сотрудников родившихся в каждом месяце и за весь год

Попробуйте. Возможны ошибки, так как не знаю что за таблица Дата2 и зачем она здесь нужна

SQL
1
2
3
4
5
TRANSFORM COUNT(*) AS [Sum-Количество]
SELECT Отдел, COUNT(*) AS ГОД, 
FROM Сотрудники
GROUP BY Отдел
PIVOT Format([Дата_рождения],"mmm") IN ("янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек")



0



0 / 0 / 0

Регистрация: 24.05.2018

Сообщений: 11

20.03.2020, 22:45

 [ТС]

4

Да, я сам крайне запутался, когда создавал данный запрос и создал Дата2 для передачи месяцев в таблицу (См.Фото)-она пустая,и использоваться не будет-так думаю.
Поле Даты_рождения это «Дата и время»(см. фото2)
Предложенный вариант не работает-пишет «Ошибка синтаксиса в инструкции TRANSFORM»(см. фото3)



0



Модератор

Эксперт MS Access

5177 / 2574 / 641

Регистрация: 12.06.2016

Сообщений: 6,848

21.03.2020, 00:11

5

Цитата
Сообщение от Hells Korzhik
Посмотреть сообщение

Предложенный вариант не работает

Вижу расхождение — в предложенном варианте PIVOT Format([Дата_рождения],»mmm»)

А у Вас как? Смотрите внимательнее.



0



Hells Korzhik

0 / 0 / 0

Регистрация: 24.05.2018

Сообщений: 11

21.03.2020, 00:32

 [ТС]

6

Сильно доработал — и получился вот такой вариант.
(Извините за путаницу в коде-у меня продолжается процесс)
Осталось доработать счетчик для месяцев

SQL
1
2
3
4
5
6
TRANSFORM COUNT(Сотрудники.дата_рождения) AS [Sum-Количество]
SELECT отдел, COUNT(Сотрудники.дата_рождения) AS ГОД
FROM Сотрудники
WHERE (((((MONTH([Сотрудники]![Дата_рождения])) ))))
GROUP BY отдел
PIVOT Format([Дата_рождения],"mm") IN ("янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек");

Миниатюры

Перекрестный запрос Microsoft Access
 



0



Hells Korzhik

0 / 0 / 0

Регистрация: 24.05.2018

Сообщений: 11

21.03.2020, 01:32

 [ТС]

7

Все получилось-спасибо за участие!

SQL
1
2
3
4
5
6
TRANSFORM COUNT (Format([Дата_рождения],"mmmm")) 
SELECT отдел, COUNT(*) AS ГОД
FROM Сотрудники
WHERE (((((MONTH([Сотрудники]![Дата_рождения])) ))))
GROUP BY  отдел 
PIVOT Format([Дата_рождения],"mmmm")  ;

Миниатюры

Перекрестный запрос Microsoft Access
 



0



I have written a VBA code in Access. But, I received syntax error in TRANSFORM statement. I would be grateful if you could help me.

Sub TransformX1()
    Dim dbs As Database
    Dim strSQL As String
    Set dbs = CurrentDb
    strSQL = "TRANSFORM Sum(BAR1.[TON]) AS SumOfTON" _
             & "SELECT BAR1.[MABD],Sum(BAR1.[TON]) AS [Total Of TON]" _
             & "FROM BAR1" _
             & "WHERE (((BAR1.[MABD]) < 1300) And ((BAR1.[MAGH]) < 1300) And ((BAR1.G) = 1))" _
             & "GROUP BY BAR1.[MABD]" _
             & "PIVOT BAR1.[MAGH]"
    DoCmd.RunSQL strSQL
End Sub

Erik A's user avatar

Erik A

31.7k12 gold badges41 silver badges65 bronze badges

asked May 21, 2018 at 8:11

Mojtaba's user avatar

1

If you examine your strSQL variable just before the RunSQL command, you’ll find that you are missing a few spaces. Replace

"TRANSFORM Sum(BAR1.[TON]) AS SumOfTON" _

with

"TRANSFORM Sum(BAR1.[TON]) AS SumOfTON " _

and so on.

answered May 21, 2018 at 8:18

Sam's user avatar

SamSam

5,3361 gold badge18 silver badges32 bronze badges

2

  • Remove From My Forums
  • Question

  • I run the following SQL statement and wind up with a ‘Data type mismatch in criteria expression’ error

    TRANSFORM Count(*)
    SELECT Postal_Code, Sex
    FROM MyTable
    GROUP BY Postal_Code, Sex
    PIVOT Switch(GetAge([DOB])<25,"Under 25", GetAge([DOB])<35,"Under 35",GetAge([DOB])<45,"Under 45", TRUE,"45+")

    First of all, I dont have a WHERE clause in there so I dont know what it is specifying as ‘criteria’. Can anyone here break this down for me? Basically, what this query is spose to do is return the number of records by Postal_Code and Sex in 4 columns, calculated
    using a custom function, GetAge, on the DOB (date) field.

    Function GetAge&(SomeDate AS Date)
        GetAge=DateDiff("yyyy", SomeDate, Date)
    End Function
    

    Thanks for any help


    50% of programming is coding. The other 90% is debugging

Answers

  • Thanks for your reply, I really do take that approach and will add it to my arsenal. However, I had found what was causing the error. Nothing was wrong with the construct of the posted SQL statement, there was a Null date in the DOB field of the under
    lying table which was causing the problem. Basically it was the GetAge function that was returning the error


    50% of programming is coding. The other 90% is debugging

    • Marked as answer by

      Thursday, November 17, 2011 7:14 PM

TRANSFORM
статФункцияинструкцияSelectPIVOTполе[IN (значение_1[,значение_2[,
…]])]

Ниже перечислены
аргументы инструкции TRANSFORM:

Элемент

Описание

статФункция

Статистическая
функция SQL,
обрабатывающая
указанные данные.

инструкцияSelect

Инструкция SELECT.

поле

Поле или выражение,
которое содержит заголовки столбцов
для результирующего набора.

значение_1,значение_2

Фиксированные
значения, используемые при создании
заголовков столбцов.

Когда данные
сгруппированы с помощью перекрестного
запроса, можно выбирать значения из
заданных столбцов или выражений как
заголовки столбцов. Это позволяет
просматривать данные в более компактной
форме, чем при работе с запросом
на выборку.

Инструкция TRANSFORM
является необязательной, но если она
присутствует, то должна быть первой
инструкцией в строке SQL. Она должна
находиться впереди инструкции SELECT,
которая указывает поля, содержащие
заголовки строк, и предложения GROUP BY,
которое задает группировку по строкам.
При желании можно включить и другие
предложения, например WHERE, для описания
дополнительных условий отбора и
сортировки. Кроме того, можно использовать
подчиненные
запросы
как предикаты в
перекрестном запросе, особенно в
предложении WHERE.

Значения, возвращенные
аргументом поле, используются в
качестве заголовков столбцов в
результирующем наборе запроса. Например,
продажи по месяцам в перекрестном
запросе образуют результирующую таблицу
из 12 столбцов. Аргументполеможно
ограничить, чтобы создать заголовки из
фиксированных значений (значение_1,значение_2), перечисленных в
необязательном предложении IN. Кроме
того, фиксированные заголовки, которым
не соответствуют реальные данные, можно
использовать для создания дополнительных
столбцов. В приведенном примере
определяется максимальная сумма заказов
клиентов на основе запросаСуммаПоЗаказам.

TRANSFORM
Max([СуммаПоЗаказам].[ПолнаяСтоимостьСДоставкой])
AS [Max-ПолнаяСтоимостьСДоставкой]

SELECT
[СуммаПоЗаказам].[Название]

FROM СуммаПоЗаказам

GROUP BY
[СуммаПоЗаказам].[Название]

PIVOT
[СуммаПоЗаказам].[КодЗаказа];

Операция union

Создает запрос
на объединение,
который объединяет
результаты нескольких независимых
запросов или таблиц.

Синтаксис

[TABLE]
запрос_1
UNION [ALL] [TABLE] запрос_2
[UNION [ALL] [TABLE] запрос_n
[ … ]]

Ниже перечислены
аргументы операции UNION:

Элемент

Описание

запрос_1-n

Инструкция SELECT, имя
сохраненного запроса или имя сохраненной
таблицы, перед которым стоит
зарезервированное слово TABLE.

Простой запрос на
объединение

Следующий запрос
на объединение содержит две инструкции
SQL SELECT, определяющие возвращение из
таблиц «Поставщики» и «Клиенты» названий
организаций и городов, находящихся в
указанной стране.

Возврат в начало

Сортировка в запросе
на объединение

В следующем запросе
на объединение отбираются все названия
организаций и городов из таблиц
«Поставщики» и «Клиенты» и выполняется
сортировка по названием городов:

SELECT
[Название], [Город]

FROM
[Поставщики]

UNION
SELECT [Название], [Город]

FROM
[Клиенты]

ORDER
BY [Город];

Переименование полей
в запросе на объединение

В следующем запросе
на объединение поле «Название» получает
при выводе результатов имя «Поставщик/Клиент»:

SELECT
[Название] AS [Поставщик/Клиент], [Город]

FROM
[Поставщики]

UNION
SELECT [Название] AS [Поставщик/Клиент],
[Город]

FROM
[Клиенты];

Дополнительные
сведения

В одной операции
UNION можно объединить в любом наборе
результаты нескольких запросов, таблиц
и инструкций SELECT. В следующем примере
объединяется существующая таблица
«Новые счета» и инструкции SELECT:

TABLE
[Новые
счета]
UNION ALL

SELECT
*

FROM
Клиенты

WHERE
СуммаЗаказа > 1000;

По умолчанию
повторяющиеся записи не возвращаются
при использовании операции UNION, однако
в нее можно добавить предикат ALL, чтобы
гарантировать возврат всех записей.
Кроме того, такие запросы выполняются
быстрее.

Все запросы,
включенные в операцию UNION, должны отбирать
одинаковое число полей; при этом типы
данных и размеры полей не обязаны
совпадать.

Используйте
псевдонимы только в первом предложении
SELECT, потому что в остальных они
пропускаются. В предложении ORDER BY
ссылайтесь на поля по их названиям в
первом предложении SELECT.

Примечания

  • В каждом аргументе запросадопускается
    использование предложения GROUP BY или
    HAVING для группировки возвращаемых
    данных.

  • В конец последнего аргумента запросаможно включить предложение ORDER BY, чтобы
    отсортировать возвращенные данные.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • Remove From My Forums
  • Question

  • TRANSFORM First (calc_flow_data.hourly_value) AS Firstofhourly_value
    SELECT dfd.flow_day_and_hour
    FROM rt_emeter_fmeter rtef
    JOIN dt_elec_mtr_data demd ON rtef.location_meters_id = demd.location_meters_id
    JOIN calc_flow_data cfd ON demd.emeter_id = dfd.emeter_id
    JOIN dt_flow_data dfd ON cfd.flow_meter_id = dfd.flow_meter_id
    WHERE cfd.energy_meter_descr = ‘kwh’
    GROUP BY dfd.flow_day_and_hour
    ORDER BY dfd.flow_day_and_hour, rtef.location_id
    PIVOT rtef.location_id

    Error:

    Msg 102, Level 15, State 1, Line 2
    Incorrect syntax near ‘cfd’.
    Msg 156, Level 15, State 1, Line 11
    Incorrect syntax near the keyword ‘PIVOT’.

    I am trying to work on the correct coding for PIVOT, however I am uncertain to the first error with CFD.  I tried changing the second line ( FROM rt_emeter_fmeter rtef ) to calc_flow_data and still had the same issue.  Any thoughts?

    Thanks,

Answers

  • This is how to make it dynamically:

    declare @SQL nvarchar(max), @Cols nvarchar(max)
    
    IF OBJECT_ID('tempDB..#TempResults',N'U') IS NOT NULL
    DROP TABLE #TempResults
    
    SELECT dfd.flow_day_and_hour, rtef.location_meters_id, cfd.hourly_value
    
    INTO #TempResults -- Save current output into temp table -- hopefully not too much data
    
    FROM dt_flow_data dfd
    JOIN calc_flow_data cfd ON cfd.flow_meter_id = dfd.flow_meter_id
    JOIN dt_elec_mtr_data demd ON demd.emeter_id = dfd.emeter_id 
    JOIN rt_emeter_fmeter rtef ON rtef.location_meters_id=demd.location_meters_id
    
    WHERE cfd.energy_meter_descr = 'kwh'
    
    select @Cols = stuff((select ', ' + quotename(LocID) 
    from (select distinct Location_Meters_ID,
    cast(Location_Meters_ID as varchar(20)) as LocID
    from #TempResults) src 
    ORDER BY Location_Meters_ID
    FOR XML PATH('')),1,2,'')
    
    SET @SQL = 'SELECT * FROM #TempResults
    PIVOT (sum(Hourly_Value) FOR Location_Meters_ID IN (' + @Cols + ')) pvt'
    
    PRINT @SQL -- for verification only
    
    EXECUTE (@SQL)
    
    

    This is from the top of my head.


    For every expert, there is an equal and opposite expert. — Becker’s Law

    My blog

    • Marked as answer by

      Friday, June 29, 2012 7:25 PM

Понравилась статья? Поделить с друзьями:
  • Access ошибка 3343
  • Access sql ошибка синтаксиса при определении поля
  • Access denied почему такая ошибка
  • Access ошибка 3326
  • Access denied ошибка на сайте