1

最初の 2 つを除く行のすべての列の合計である 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クエリにa がありません。とにかく、1 つの方法は派生テーブルを使用することです。

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 に答える