以最佳方式生成报告

Art*_*yan -1 sql-server

我有一个具有以下结构的 SQL Server 数据库

CREATE TABLE users (
userid INT IDENTITY PRIMARY KEY CLUSTERED, 
age INT
)
GO
CREATE TABLE userstatus(
userstatusID INT IDENTITY PRIMARY KEY CLUSTERED, 
statusid INT, 
userid INT FOREIGN KEY REFERENCES dbo.users(userid)
)
GO
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

INSERT  INTO dbo.users
        ( age )
VALUES  ( 15  -- age - int
          ),
        ( 20 ),
        ( 25 );

INSERT  INTO dbo.userstatus
        ( statusid, userid )
VALUES  ( 1, 1 ),
        ( 1, 2 ),
        ( 1, 3 ),
        ( 2, 1 ),
        ( 3, 1 ),
        ( 2, 2 );
Run Code Online (Sandbox Code Playgroud)

现在我想得到用户年龄的总和,以及状态=2 的用户年龄的总和。

就像是:

年龄与状态 = 2: 35
总年龄:60

Lam*_*mak 6

这看起来很简单:

SELECT  SUM(CASE WHEN us.userid IS NOT NULL THEN u.age END) FilteredAge,
        SUM(u.age) TotalAge
FROM dbo.users u
LEFT JOIN dbo.userstatus us
    ON u.userid = us.userid
    AND us.statusid = 2
;
Run Code Online (Sandbox Code Playgroud)

更新:

对于同一个用户在dbo.userstatus表中有多个相同状态的情况,可以使用:

SELECT  SUM(CASE WHEN us.userid IS NOT NULL THEN u.age END) FilteredAge,
        SUM(u.age) TotalAge
FROM dbo.users u
LEFT JOIN ( SELECT DISTINCT userid
            FROM dbo.userstatus 
            WHERE statusid = 2) us
    ON u.userid = us.userid
;
Run Code Online (Sandbox Code Playgroud)

  • 不,请**不要**再更新一次问题。您的问题已经得到解答。您可以将答案标记为已接受。如果您有其他问题,请发布另一个问题。 (3认同)