【发布时间】:2018-12-08 22:26:52
【问题描述】:
我有一个带有多个属性的查询,看起来像这样。
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 生成的查询如下所示。
SELECT COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-01-01' AND '2018-01-31' THEN 1 ELSE NULL END) AS [Jan], 计数(转换时的案例(日期,[Field1])在“2018-02-01”和“2018-02-28”之间,然后 1 ELSE NULL END)作为 [2 月], 计数(转换时的案例(日期,[Field1])在“2018-03-01”和“2018-03-31”之间,然后 1 ELSE NULL END)作为 [Mar] FROM [dbo].[Table1] AS [table1] WHERE [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(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-01-01' AND '2018-01-31' THEN 1 ELSE NULL END)\" },\"Jan\"],[{\"val\":\"COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-02-01' AND '2018-02-28' THEN 1 ELSE NULL END)\"},\"Feb\"],[{\"val\":\"COUNT(CASE WHEN CONVERT(date,[Field1]) BETWEEN '2018-03-01' AND '2018-03- 31' THEN 1 ELSE NULL END)\"},\"Mar\"]] 不是有效的属性定义。请使用以下格式:['属性定义', '别名']
所以它有点创建正确的查询,但有很多额外的符号。
所以我的问题是,有没有办法做到这一点?
【问题讨论】:
标签: javascript node.js sequelize.js