1

我正在尝试开发一个 SQL 字段,它是除前两个之外的行的所有列的总和。下面是我的代码,它返回 MonthYear、Total、Sum1、Sum2 和 Sum3 列。我想要一个总计 Sum1、Sum2 和 Sum3 的 FinalSum。这将用于反检查 Total 列的准确性。有没有办法做到这一点?运行 Microsoft SQL Server 2005 - T-SQL

SELECT MonthYear,
            COUNT(*) AS Total,
            ISNULL(
                SUM(
                    CASE 
                    WHEN Status='Sum1'                  THEN 1
                    ELSE 0
                    END
                )
            ,0) AS [Sum1],
ISNULL(
                SUM(
                    CASE 
                    WHEN Status='Sum2'                  THEN 1
                    ELSE 0
                    END
                )
            ,0) AS [Sum2],
ISNULL(
                SUM(
                    CASE 
                    WHEN Status='Sum3'                  THEN 1
                    ELSE 0
                    END
                )
            ,0) AS [Sum3]
FROM tablename

GROUP BY
    MonthYear
4

5 回答 5

6

您在查询中遗漏了一个FROM。无论如何,一种方法是使用派生表:

SELECT *, [Sum1]+[Sum2]+[Sum3] AS TotalSum
FROM (Your Current Select Here) AS T

对于 SQL Server 2005+,您还可以使用 CTE:

;WITH CTE AS 
(
    Your Current Select Here
)
SELECT *, [Sum1]+[Sum2]+[Sum3] AS TotalSum
FROM CTE
于 2012-06-22T17:37:01.950 回答
1

好的 - 可能不是最优雅的方式(副本保存在 SqlFiddle 上

CREATE TABLE this_name 
(
    monthYear DateTime,
    status varchar(20), 
   );

INSERT INTO this_name
(monthYear, status)
VALUES
('01 jan 2012', 'Sum1'),
('01 jan 2012', 'Sum1'),
('01 feb 2012', 'Sum2'),
('01 feb 2012', 'Sum1'),
('01 apr 2012', 'Sum3'),
('01 jan 2013', 'Sum3'),
('01 jan 2013', 'Sum3'),
('01 jan 2012', 'Sum3')

;WITH myCTE (MonthYear,Total, Sum1, Sum2, Sum3)
AS
(
SELECT MonthYear,
       COUNT(*) AS Total,
       SUM(CASE WHEN ISNULL(Status,'X')='Sum1' THEN 1 ELSE 0 END) AS [Sum1],
       SUM(CASE WHEN ISNULL(Status,'X')='Sum2'THEN 1 ELSE 0 END ) AS [Sum2],
       SUM(CASE WHEN ISNULL(Status,'X')='Sum3' THEN 1 ELSE 0 END) AS [Sum3] 
FROM this_name
GROUP BY MonthYear
)   
SELECT 
  MonthYear,
  Total, 
  Sum1, 
  Sum2, 
  Sum3,
  (Sum1 + Sum2 + Sum3) [CountTotal]
FROM myCTE

另一种选择是这个([SQLFiddle] ;

SELECT MonthYear,
   COUNT(*) AS Total,
   SUM(CASE WHEN ISNULL(Status,'X')='Sum1' THEN 1 ELSE 0 END) AS [Sum1],
   SUM(CASE WHEN ISNULL(Status,'X')='Sum2'THEN 1 ELSE 0 END ) AS [Sum2],
   SUM(CASE WHEN ISNULL(Status,'X')='Sum3' THEN 1 ELSE 0 END) AS [Sum3], 

   SUM(CASE WHEN ISNULL(Status,'X')IN('Sum1','Sum2','Sum3') THEN 1 ELSE 0 END) AS [SumExtra]  
FROM this_name
GROUP BY MonthYear
于 2012-06-22T18:18:20.657 回答
0
declare @sum1 int, @sum2 int, @sum3 int
declare @totalSum int = 0

select @sum1 = ISNULL(SUM(CASE WHEN Status='Sum1' THEN 1 ELSE 0 END), 0)
from tablename

select @sum2 = ISNULL(SUM(CASE WHEN Status='Sum2' THEN 1 ELSE 0 END), 0)
from tablename

select @sum3 = ISNULL(SUM(CASE WHEN Status='Sum3' THEN 1 ELSE 0 END), 0)
from tablename

set @totalSum = @sum1 + @sum2 + @sum3

SELECT MonthYear, COUNT(*) AS Total,
            ISNULL(SUM(
                    CASE 
                    WHEN Status='Sum1' THEN 1
                    ELSE 0
                    END
                ), 0) AS [Sum1],
            ISNULL(SUM(
                    CASE 
                    WHEN Status='Sum2' THEN 1
                    ELSE 0
                    END), 0) AS [Sum2],
            ISNULL(SUM(
                    CASE 
                    WHEN Status='Sum3' THEN 1
                    ELSE 0
                    END), 0) AS [Sum3],
            @totalSum
FROM tablename

GROUP BY
    MonthYear
于 2012-06-22T17:49:59.313 回答
0

使用临时表的一种方法

CREATE TABLE #Table2
(
    MonthYear VARCHAR(6) NOT NULL PRIMARY KEY,
    Total INT NOT NULL,
    Sum1 INT NOT NULL,
    Sum2 INT NOT NULL,
    Sum3 INT NOT NULL
) ;

INSERT INTO #Table2
SELECT
        MonthYear,
        COUNT(*) AS Total,
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum1' THEN 1 ELSE 0 END),
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum2' THEN 1 ELSE 0 END),
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum3' THEN 1 ELSE 0 END)
FROM tablename
GROUP BY MonthYear ;

SELECT *, Sum1Count + Sum2Count + Sum3Count AS FinalSum FROM #Table2 ;
于 2012-06-22T18:06:33.983 回答
0

重复计算的另一种方法

SELECT
        MonthYear,
        COUNT(*) AS Total,
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum1' THEN 1 ELSE 0 END) AS [Sum1],
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum2' THEN 1 ELSE 0 END) AS [Sum2],
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum3' THEN 1 ELSE 0 END) AS [Sum3],
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum1' THEN 1 ELSE 0 END) +
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum2' THEN 1 ELSE 0 END) +
        SUM(CASE WHEN ISNULL(Status, '') = 'Sum3' THEN 1 ELSE 0 END) AS [FinalSum]
FROM tablename
GROUP BY MonthYear ;
于 2012-06-22T18:09:37.667 回答