【问题标题】:Counting distinct values within group计算组内的不同值
【发布时间】:2018-01-17 04:20:15
【问题描述】:

给定一张这样的表格:

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

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

【问题讨论】:

    标签: sql sql-server sequelize.js


    【解决方案1】:

    我认为在查询末尾聚合真、假和未定义的计数以及 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 似乎支持我给出的答案。

    【讨论】:

    • 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,因此是 sequelize
    • 好吧,我的查询也应该在 SQLite except 上运行,最后的 FOR JSON AUTO 部分。这是特定于 SQL Server 的。
    猜你喜欢
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2022-11-22
    • 2017-09-14
    相关资源
    最近更新 更多