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)
起泡,冲洗,对我的每一列重复。我知道这并不理想,因为如果有需要考虑的新列,它需要维护,但无论如何在这种情况下还有其他维护,所以我可以处理它。
总之
有没有办法创建一个查询来为我提供我喜欢的解决方案?如果不是,我对替代解决方案的想法是否合理?
此解决方案为您提供“替代解决方案”答案。实现您正在寻找的主要解决方案的唯一方法是在您取消旋转后对结果集进行动态旋转操作。该解决方案确实需要维护,但很简单,不需要任何功能。
样本数据:
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 电子表格中复制的。您将有一个包含三列(日期、名称和值)的表,然后基于它进行查询。
归档时间: |
|
查看次数: |
6019 次 |
最近记录: |