计算组内的不同值

时间:2017-08-09 10:20:45

标签: sql sql-server sequelize.js

给出一个像这样的表:

| JobId | Result |
|-------|--------|
| 1     | true   |
| 1     | false  |
| 1     | true   |
| 1     |        |
| 2     | false  |
| 2     | false  |
| 1     | true   |
| 1     | true   |
| 1     | true   |

SQL查询是否可以生成这样的输出?

[{JobId: 1, true: 2, false: 1, undefined: 1},
{JobId: 2, true: 3, false: 2, undefined: 0}]

我目前正在使用ORM Sequelize,但可以使用原始查询,这是我到目前为止所做的。

db.JobResponse.findAll({
    where: {
        jobId: job
    },
    attributes: ['JobId', [fn('sum', col('result'))]],
    group: ['JobId']
}).then(result => {
    res.status(200).send({
        data: result
    });
})

目前正在尝试sum result列,按JobId进行分组,但是,结果是布尔值(预期值为true,false和undefined),所以简单求和不会工作。是否可以计算组内每个不同的值?

1 个答案:

答案 0 :(得分:3)

我认为在查询结束时聚合true,false和undefined标签以及FOR JSON AUTO的基本数据透视查询应生成所需的结果:

SELECT
    JobId,
    SUM(CASE WHEN Result = 'true' THEN 1 ELSE 0 END) AS true,
    SUM(CASE WHEN Result = 'false' THEN 1 ELSE 0 END) AS false,
    SUM(CASE WHEN Result IS NULL  THEN 1 ELSE 0 END) AS undefined
FROM yourTable
GROUP BY JobId
FOR JSON AUTO;    -- convert each result record to a JSON element inside an outer array []

我实际上无法对此进行测试,因为Rextester和SQLFiddle似乎都不支持SQL Server JSON扩展。但this useful tutorial似乎支持我给出的答案。