仅选择 sum(column) > 0 的列

Fre*_*Man 3 sql-server sql-server-2014

我有一张这样的表:

Date     Bob     Joe     Will
1/1/15    1       0        1
1/2/15    0       0        1
1/3/15    0       0        0
1/4/15    1       1        1
Run Code Online (Sandbox Code Playgroud)

首选方案

有了一个说法,我想回到列其中SUM(Column) > 0

例如:

SELECT SUM(Bob) as Robert, SUM(Joe) as Joseph, SUM(Will) as William
  FROM table
 WHERE Date BETWEEN '1/1/15' and '1/3/15'
Run Code Online (Sandbox Code Playgroud)

我希望我的结果看起来像这样:

Robert     William
  1           2
Run Code Online (Sandbox Code Playgroud)

换句话说,因为SUM(Joe) = 0对于我选择的日期范围,我不希望该列出Joseph现在结果集中。会导致Joseph不出现的魔法是什么?

替代解决方案

如果返回的数据略有不同,我可以处理它,所以我考虑编写一个表函数来返回一个 2 列表,如下所示:

Name        Value
Robert      1
William     2
Run Code Online (Sandbox Code Playgroud)

我的想法是函数代码看起来类似于:

--Declare table here
IF SELECT SUM(Bob) > 0
  INSERT INTO temp (Name, Value)
    ('Robert', SELECT SUM(Bob))
Run Code Online (Sandbox Code Playgroud)

起泡,冲洗,对我的每一列重复。我知道这并不理想,因为如果有需要考虑的新列,它需要维护,但无论如何在这种情况下还有其他维护,所以我可以处理它。

总之

有没有办法创建一个查询来为我提供我喜欢的解决方案?如果不是,我对替代解决方案的想法是否合理?

Jon*_*ite 6

此解决方案为您提供“替代解决方案”答案。实现您正在寻找的主要解决方案的唯一方法是在您取消旋转后对结果集进行动态旋转操作。该解决方案确实需要维护,但很简单,不需要任何功能。

样本数据:

DECLARE @Names TABLE
    (
      DateValue DATE NOT NULL
    , Bob INT NOT NULL
    , Joe INT NOT NULL
    , Will INT NOT NULL
    );

DECLARE @MinDate DATE = '1/1/2015';
DECLARE @MaxDate DATE = '1/3/2015';
DECLARE @MinValue INT = 1;

INSERT  INTO @Names
        ( DateValue, Bob, Joe, Will )
VALUES  ( '1/1/2015', 1, 0, 1 )
        , ( '1/2/2015', 0, 0, 1 )
        , ( '1/3/2015', 0, 0, 0 )
        , ( '1/4/2015', 1, 1, 1 );
Run Code Online (Sandbox Code Playgroud)

询问:

WITH    CTE_Unpivot
          AS ( SELECT   DateValue
                      , ScoreName
                      , Scores
               FROM     ( SELECT    DateValue
                                    , Bob
                                    , Joe
                                    , Will
                          FROM      @Names
                        ) AS cp 
               UNPIVOT  ( Scores FOR ScoreName IN ( Bob, Joe, Will ) ) AS up
             )
    SELECT  ScoreName
          , SUM(Scores) AS ScoreTotal
    FROM    CTE_Unpivot
    WHERE   DateValue BETWEEN @MinDate AND @MaxDate
    GROUP BY ScoreName
    HAVING  SUM(Scores) >= @MinValue;
Run Code Online (Sandbox Code Playgroud)

编辑:
理想情况下,您不会像这样存储表格,它看起来像是从 Excel 电子表格中复制的。您将有一个包含三列(日期、名称和值)的表,然后基于它进行查询。