多列的大小写和总和

Posted

技术标签:

【中文标题】多列的大小写和总和【英文标题】:Case and Sum of Multiple columns 【发布时间】:2014-09-22 23:13:59 【问题描述】:

在我的数据库中,我有几千名客户,某些标准以不同的时间间隔发生。一周中的每一天都有列(M,Tu,W,Th,F,Sa,Su)。我需要查看每周有多少天会触发任务。我有下面的查询,但它当然也会返回一周中的特定日期以及每周的 TotalDays。但是,我只需要查看 TotalDays 而不是每天的额外显示。我怎样才能做到这一点?

SELECT X.*,M+Tu+W+Th+F+Sa+Su AS TotalDays
FROM
    (
    SELECT
        CASE WHEN [M] = '1' THEN 1 ELSE 0 END as "M",
        CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END as  "Tu",
        CASE WHEN [W] = '1' THEN 1 ELSE 0 END as "W",
        CASE WHEN [Th] = '1' THEN 1 ELSE 0 END as  "Th",
        CASE WHEN [F] = '1' THEN 1 ELSE 0 END as "F",
        CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END as  "Sa",
        CASE WHEN [Su] = '1' THEN 1 ELSE 0 END as "Su"
    FROM
        Customers
    ) X

我应该说这里的数据类型是位,所以我不能只做如下的总和,因为这会返回数据类型位对求和运算符无效的错误。

SELECT 
 (SUM(M) + SUM(Tu) + SUM(W) + SUM(Th) + SUM(F) + SUM(Sa) + SUM(Su)) as TotalDays
FROM Customers

【问题讨论】:

如果使用 COUNT 而不是 SUM 会怎样? COUNT 不起作用,因为它为每个客户返回 7,因此它同时计算 0 和 1 值。如前所述,SUM 不起作用我得到返回的错误,即数据类型位对 sum 运算符无效。 【参考方案1】:

这是你想要的吗?

SELECT SUM(CASE WHEN [M] = '1' THEN 1 ELSE 0 END +
           CASE WHEN [Tu] = '1' THEN 1 ELSE 0 END +
           CASE WHEN [W] = '1' THEN 1 ELSE 0 END +
           CASE WHEN [Th] = '1' THEN 1 ELSE 0 END +
           CASE WHEN [F] = '1' THEN 1 ELSE 0 END +
           CASE WHEN [Sa] = '1' THEN 1 ELSE 0 END +
           CASE WHEN [Su] = '1' THEN 1 ELSE 0 END
          )
FROM Customers;

【讨论】:

这正是我所需要的。非常感谢!

以上是关于多列的大小写和总和的主要内容,如果未能解决你的问题,请参考以下文章

根据列表大小调整引导菜单多列的大小

多列不区分大小写的组

MySQL:在一列中选择多列和总和

总和小于 M 的大小为 K 的子集的最大总和

来自 groupby 多列的 bin 大小的嵌套字典

为啥符号大小的总和远小于“.text”部分的大小?