1

我有 4 个查询是相同的,但最后的条件子句之一除外。如果可能的话,我正在尝试找到一种方法将这 4 个压缩为 1 个。目前,我们编写的一个程序通过 4 个存储过程调用这 4 个语句,但是如果我可以进行 1 个返回所有 4 个的调用,那就太好了。以下是声明的大部分内容:

SELECT SUM(PausedTime) AS PausedMode
FROM UsageStats
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) AND  StopDate < CONVERT(VARCHAR(8), @EndDate, 112)
AND LocationID = @LocationID
AND SystemID = @SystemID
AND PlayingArea = @PlayingArea
AND PausedTime > 0

我还有 3 个这样的,唯一改变的是 SUM 计算中的字段(所有 SUM 字段都是类型int):

SUM(PlayModeTime) AS PlayModeTime
SUM(RecordModeTime) AS RecordModeTime
SUM(ReplayModeTime) AS ReplayModeTime

最后一个AND条件 AND PlayModeTime > 0 AND RecordModeTime > 0 AND ReplayModeTime > 0

我尝试CASE在 select 子句中使用该语句,但失败了:

SELECT
    playMode = (CASE WHEN PlayModeTime > 0 THEN SUM(PlayModeTime) END),
    pausedMode = (CASE WHEN PausedTime > 0 THEN SUM(PausedTime) END),
    recordMode = (CASE WHEN RecordModeTime > 0 THEN SUM(RecordModeTime) END),
    replayMode = (CASE WHEN ReplayModeTime > 0 THEN SUM(ReplayModeTime) END)
FROM UsageStats
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) AND  StopDate < CONVERT(VARCHAR(8), @EndDate, 112)
AND LocationID = @LocationID
AND SystemID = @SystemID
AND PlayingArea = @PlayingArea
GROUP BY PlayModeTime, PausedTime, RecordModeTime, ReplayModeTime

我想得到这样的东西:

PlayModeTime   | PausedMode  | RecordModeTime  | ReplayModeTime
---------------------------------------------------------------
 200              340            10               55

任何帮助表示赞赏。

4

2 回答 2

2

我根本不明白你为什么需要这些条件,因为SUM当值为0. 你不能只是你SUM所有的专栏吗?:

SELECT
    playMode = SUM(PlayModeTime),
    pausedMode = SUM(PausedTime),
    recordMode = SUM(RecordModeTime),
    replayMode = SUM(ReplayModeTime)
FROM UsageStats
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) 
AND StopDate < CONVERT(VARCHAR(8), @EndDate, 112)
AND LocationID = @LocationID
AND SystemID = @SystemID
AND PlayingArea = @PlayingArea
于 2013-08-12T19:57:11.263 回答
0

您需要将总和移出 case 语句:

SELECT
    playMode = SUM(CASE WHEN PlayModeTime > 0 THEN PlayModeTime ELSE 0 END),
    pausedMode = SUM(CASE WHEN PausedTime > 0 THEN PausedTime ELSE 0 END),
    recordMode = SUM(CASE WHEN RecordModeTime > 0 THEN RecordModeTime ELSE 0 END),
    replayMode = SUM(CASE WHEN ReplayModeTime > 0 THEN ReplayModeTime ELSE 0 END)
FROM UsageStats
WHERE StartDate >= CONVERT(VARCHAR(8), @StartDate, 112) AND  StopDate < CONVERT(VARCHAR(8), @EndDate, 112)
AND LocationID = @LocationID
AND SystemID = @SystemID
AND PlayingArea = @PlayingArea
GROUP BY PlayModeTime, PausedTime, RecordModeTime, ReplayModeTime

原因是将对每一行评估案例。在您的示例中,您正在获取列的总和,但仅针对该行。

这仅与上述Lamak的答案不同,它将负值视为总和中的零。

于 2013-08-12T20:25:43.937 回答