Sql 计算组内的不同值

Sql 计算组内的不同值,sql,sql-server,sequelize.js,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, tr

给出这样一张表:

| 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
    });
})

目前,它正试图对
结果
列进行
求和,按
JobId
分组,但是,结果是布尔值(期望值为true、false和未定义),因此简单求和不起作用。是否可以在一个组中按不同的值进行计数?

我认为在查询结束时,一个基本的pivot查询将真、假和未定义的计数与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扩展。但似乎支持我给出的答案。

hmmm,这似乎有点可行,因为如果我没有
true
结果,则查询返回0,如果我有1
true
结果,则查询计数为1。但是,如果我有2个
true
结果,查询仍然只返回1。。。我得到的响应类似于
{data:[{JobId:1,true:1,false:0,undefined:1}}
我认为我的查询没有问题。也许你的数据有问题,我不这么认为。我正在对一个API端点进行单元测试,测试使用SQLite(所以我没有使用最后的JSON行)。正如我所说,0和1是正确的,但是如果我复制并粘贴
true
结果到我的SQLite JSON种子中,我仍然只得到1?在生产中我使用SQL Server,但是我的单元测试使用SQLite,因此sequelizeWell我的查询也应该在SQLite上运行,除了最后的
for JSON AUTO
部分。这是特定于SQL Server的。