我有一个查询,其多个属性如下所示。
const queryPvCompletedByMonth = {
attributes: [
[
Sequelize.literal(
`COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(0).startDate}' AND '${
getFirstAndLastDayInMonth(0).endDate
}' THEN 1 ELSE NULL END)`
),
'Jan',
],
[
Sequelize.literal(
`COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(1).startDate}' AND '${
getFirstAndLastDayInMonth(1).endDate
}' THEN 1 ELSE NULL END)`
),
'Feb',
],
[
Sequelize.literal(
`COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${getFirstAndLastDayInMonth(2).startDate}' AND '${
getFirstAndLastDayInMonth(2).endDate
}' THEN 1 ELSE NULL END)`
),
'Mar',
],
],
where: {
Field2: 2,
},
raw: false,
};
一直如此。这是有效的,我从查询中得到了预期的结果。
sequelize生成的查询如下所示。
选择count(case when convert(date,[field1])between'2018-01-01'and'2018-01-31'then 1 else null end)作为[jan],
将'2018-02-01'和'2018-02-28'之间的(日期,[field1])转换为[feb],
将'2018-03-01'和'2018-03-31'之间的(日期,[field1])转换为[mar]
从[dbo].[table1]作为[table1],其中[table1].[field2]=2;
我不希望有12个硬编码属性,而是希望动态地插入它们。所以我把所有的月份都排成这样。
const months = [
{ index: 0, name: 'Jan' },
{ index: 1, name: 'Feb' },
{ index: 2, name: 'Mar' },
{ index: 3, name: 'Apr' },
{ index: 4, name: 'May' },
{ index: 5, name: 'Jun' },
{ index: 6, name: 'Jul' },
{ index: 7, name: 'Aug' },
{ index: 8, name: 'Sep' },
{ index: 9, name: 'Oct' },
{ index: 10, name: 'Nov' },
{ index: 11, name: 'Dec' },
];
并尝试通过列表映射以返回这样的属性。
const queryPvCompletedByMonth = {
attributes: [
months.map(m => [
Sequelize.literal(
`COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '${
getFirstAndLastDayInMonth(m.index).startDate
}' AND '${getFirstAndLastDayInMonth(m.index).endDate}' THEN 1 ELSE NULL END)`
),
m.name,
]),
],
where: {
AOTyp: 2,
},
raw: false,
};
这给了我一个错误从续集
[[{“val\”:\“count(转换时的大小写(日期,[field1])介于'2018-01-01'和'2018-01-31'之间,然后是1个空结尾)\”},\“jan\”],[{“val\”:\“count(转换时的大小写(日期,[field1]),介于'2018-02-01'和'2018-02-28'之间,然后是1个空结尾)\”},\“feb\”,[{“val\”:\“count(转换时的大小写(日期,[field1])在'2018-03-01'和'2018-03-31'之间,则1 else null end)\“},\”mar\“]]不是有效的属性定义。请使用以下格式:[“属性定义”,“别名”]
所以它创建了一个正确的查询,但是有很多axtra符号。
所以我的问题是,有没有办法做到这一点?