1

我有 2 张桌子,门票一个代币。标记为列 user_type。

我正在尝试计算如何计算所有在 tokens.ticket_id 上加入的没有tokens.user_type == 'ADMIN'. 所以user_type可以等于任何东西,除了管理员。

问题是一张票可能还有 5 个其他令牌。

我对 SQL 知识有一定的了解,但这个知识让我困惑了一段时间。

如果标题写得不正确,也很抱歉。谢谢你,基兰!

编辑

我可能解释错了。但这仍然比应有的回报更多。如果它有一个 ADMIN 令牌,它不应该出现在结果中,否则它应该出现。我添加了这个,因为 stackoverflow 抱怨没有实质性的更改来进行编辑。

4

4 回答 4

1

像这样的东西可能是您正在寻找的东西:

SELECT
    COUNT(DISTINCT Tickets.id)
FROM
    Tickets
    INNER JOIN Tokens
        ON Tokens.ticket_id = Tickets.id
        AND Tokens.user_type != 'ADMIN'


如果您需要包含没有令牌的票,这可能有效:

SELECT
    COUNT(DISTINCT Tickets.id)
FROM
    Tickets
    LEFT JOIN Tokens
        ON Tokens.ticket_id = Tickets.id
WHERE
    Tokens.user_type != 'ADMIN'
于 2013-03-20T19:20:30.443 回答
1

尝试:

Select Count(*) From Tickets t
Where Not Exists(Select * From tokens
                 Where ticket_Id = t.Ticket_id
                     And user_type ='Admin')
于 2013-03-20T19:21:24.153 回答
0

尝试:

SELECT COUNT(DISTINCT Tickets.id) - 
       COUNT(DISTINCT CASE WHEN Tokens.user_type = 'ADMIN' THEN Tickets.id END)
FROM Tickets
LEFT JOIN Tokens ON Tokens.ticket_id = Tickets.id

如果您的摘要不需要来自 Tokens 表的信息,则可以更有效地将其重写为:

SELECT COUNT(*)
FROM Tickets
LEFT JOIN Tokens ON Tokens.ticket_id = Tickets.id AND Tokens.user_type = 'ADMIN'
WHERE Tokens.ticket_id IS NULL
于 2013-03-20T19:35:05.033 回答
0

我会在函数时聚合一个案例,这样你就可以说边缘案例的数量和总数:

declare @Person Table ( personID int identity, person varchar(8));

insert into @Person values ('Brett'),('Paul'),('John');

declare @Orders table ( OrderID int identity, PersonID int, Description varchar(32), Amount int);

insert into @Orders values (1, 'Shirt', 20),(1, 'Shirt', 50),(1, 'Shirt', 22),(1, 'Admin', 52),(2, 'Shirt', 22),(2, 'Admin', 52);

Select
    p.person
,   count(case when o.Description != 'Admin' then o.orderID end) as NonAdminOrders
,   count(o.orderID) as TotalOrders
from @Person p
    left join @Orders o on p.personID = o.PersonID
group by p.person
于 2013-03-20T19:24:19.517 回答