2014-09-22 100 views
0

在我的数据库中,我有几千名客户,其中某些标准以不同的间隔发生。每周的每一天都有列(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 
+1

如果您使用COUNT而不是SUM,该怎么办? – Pieter21 2014-09-22 23:16:23

+0

COUNT不起作用,因为它会为每个客户返回7,因此它会同时计算0和1的值。如上所述,SUM不起作用我得到返回的错误,数据类型位对于求和运算符是无效的。 – aantiix 2014-09-22 23:38:21

回答

3

这是你想要的吗?

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; 
+0

这正是我所需要的。非常感谢! – aantiix 2014-09-22 23:47:30