Kotlin Выставленная сумма при условии (CaseWhenElse) - PullRequest
0 голосов
/ 06 января 2020

У меня есть таблица со структурой данных, например:

id    type   cityName   regDate
1249     0   City1      2019-10-01

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

data class NewClientsNumberCityMonth(
    val cityName: String = "",
    val januaryNewClientsNumber :Int = 0,
    val februaryNewClientsNumber :Int = 0,
    val marchNewClientsNumber :Int = 0,
    val aprilNewClientsNumber :Int = 0,
    val mayNewClientsNumber :Int = 0,
    val juneNewClientsNumber :Int = 0,
    val julyNewClientsNumber :Int = 0,
    val augustNewClientsNumber :Int = 0,
    val septemberNewClientsNumber :Int = 0,
    val octoberNewClientsNumber :Int = 0,
    val novemberNewClientsNumber :Int = 0,
    val decemberNewClientsNumber :Int = 0
    val total :Int = 0
)

и использовать эти объекты в качестве строк для заполнения таблицы (мы не знаем количество уникальных городов), результат должен выглядеть следующим образом:

City1     5    8    3    1    2    1    4    1    2    1    0    0 
City2    69   23    7    5    3   10   24   14   12   23   25   10
...

я пытаюсь это

val tempMutList = mutableListOf<NewClientsNumberCityMonthModel>()

transaction(Connection.TRANSACTION_SERIALIZABLE, 2) {
                        addLogger(StdOutSqlLogger)


                        ClientsDataExposed
                            .slice(ClientsDataExposed.cityName)
                            .selectAll()
                            .groupBy(ClientsDataExposed.cityName)
                            .map { it[ClientsDataExposed.cityName] }
                            .toList().forEach {

                              val regsInCity = ClientsDataExposed
                                .slice(
                                        ClientsDataExposed.id,
                                        ClientsDataExposed.cityName,
                                        ClientsDataExposed.type,
                                        ClientsDataExposed.regDate,
                                        ClientsDataExposed.regDate.month()

                                    )
                                    .selectAll()
                                    .andWhere { ClientsDataExposed.cityName.eq(it) }
                                    .andWhere {
                                        ClientsDataExposed.regDate.between(
                                            Date.valueOf("2019-01-01".toString()),
                                            Date.valueOf("2020-01-01".toString())
                                        )
                                    }
                                    .andWhere {
                                        (ClientsDataExposed.type.inList(contracterTypeSelectedCheckboxes.filterValues { it }.keys.toList())) and (ClientsDataExposed.cityName.inList(
                                            citiesSelectedChekboxes.filterValues { it }.keys.toList()
                                        ))
                                    }
                                    .map { it[ClientsDataExposed.regDate.month()] }
                                    .toList()

                        val cityClientsPerMonth = NewClientsNumberCityMonthModel(
                            it,
                            regsInCity.count { it == 1 },
                            regsInCity.count { it == 2 },
                            regsInCity.count { it == 3 },
                            regsInCity.count { it == 4 },
                            regsInCity.count { it == 5 },
                            regsInCity.count { it == 6 },
                            regsInCity.count { it == 7 },
                            regsInCity.count { it == 8 },
                            regsInCity.count { it == 9 },
                            regsInCity.count { it == 10 },
                            regsInCity.count { it == 11 },
                            regsInCity.count { it == 12 },
                            regsInCity.count()
                            )
                               tempMutList.add(cityClientsPerMonth)    

                                //obj of dataclass
                            }

               viewTableTabOfnewClientsNumberCityMonth.value = tempMutList.map { it }
}

я знаю, что я должен использовать Sum () и CaseWhenElse, например здесь , с проверкой на ClientsDataExposed.regDate.month(), которая дает номер месяца (1-12), чтобы присвоить результат sum () к моему свойству класса данных, но я не могу найти никаких примеров синтаксиса CaseWhenElse, и я не могу понять это сам, или может быть есть другой способ получить его без использования CaseWhenElse?

1 Ответ

0 голосов
/ 15 февраля 2020

Пожалуйста, проверьте этот код:

    val monthExpr = ClientsDataExposed.regDate.month()

    fun sumByMonth(monthNum: Int) = Expression.build { 
        val caseExpr = case().
            When(monthExpr eq intLiteral(monthNum), intLiteral(1)).
            Else(intLiteral(0))
        Sum(caseExpr, IntegerColumnType())
    }

    val janSumExp = sumByMonth(1)
    val febSumExp = sumByMonth(2)
    ClientsDataExposed.
        slice(ClientsDataExposed.cityName, janSumExp, febSumExp).
        selectAll().
        groupBy(ClientsDataExposed.id).map { 
          val janSum = it[janSumExp]
          val febSum = it[febSumExp]
          ...
        }
...