2

我有一张桌子,里面有一个 user_id 和一个 ticket_type。我想创建一个 sql 语句,它将返回每个 user_id 生成的每个 ticket_type 的计数。

我想出了这个,但这涉及到ticket_type的一些我不喜欢的硬编码。

select b.user_id, b.TypeA, B.TypeB, (b.TypeA + b.TypeB) As "Total Tickets" from
(select user_id, 
sum(case when ticket_type = '1' then 1 else 0 end) as "TypeA",
sum(case when ticket_type = '2' then 1 else 0 end) as "TypeB"
from 
database
group by user_id
) as b; 

有一个更好的方法吗?如果有人也可以在 linq 查询表达式中提供答案,那将是非常棒的。

编辑样本输出

User_ID Type_A Type_B 总计
用户 1 3 5 8
用户 2 1 2 3        
用户 3 6 8 14

示例数据库表

DECLARE @Users As TABLE
(
    SN int,
    User_ID char(5),
    Ticket_Type int
)

INSERT INTO @Users VALUES
(1, 'user1', 1),
(2, 'user1', 1),
(3, 'user2', 2),
(4, 'user3', 1),
(5, 'user1', 2),
(6, 'user1', 2),
(7, 'user2', 2),
(8, 'user2', 2)
4

3 回答 3

1

只是为了显示其他可能性,您可以尝试使用 PIVOT 运算符。您只需在一个地方定义名称(枢轴运算符)。例如,我包括了第三种票类型(加上总数的列)。如果要避免 NULL 并重命名字段(票证类型),则必须为外部 SELECT 中的每个字段使用 COALESCE 和别名

SELECT RC2.* 
FROM
(  select user_id
    , CASE WHEN GROUPING(ticket_type)=1 THEN 'TOT_TCK' ELSE CAST(ticket_type AS VARCHAR(4)) END AS TICKET_TYPE
    , COUNT(*) AS RC 
 from  @USERS
 group by rollup(ticket_type), user_id
 ) A
 PIVOT (SUM(RC) FOR TICKET_TYPE IN ([1],[2],[3],[TOT_TCK])) AS RC2

输出:

user_id 1           2           3           TOT_TCK
------- ----------- ----------- ----------- -----------
user1   2           2           NULL        4
user2   NULL        3           NULL        3
user3   1           NULL        NULL        1
于 2017-04-28T10:56:47.033 回答
1

您可以使用以下 linq 查询。

 var result= from a in db.somename group a by user_id into b 
    select new { UserId=b.user_id, 
    TypeA= ( from x in b select x.ticket_type == 1 ? 1 : 0) .Sum() ,
    TypeB= ( from x in b select x.ticket_type == 2 ? 1 : 0) .Sum() };
于 2017-05-03T09:53:20.760 回答
0

在没有要运行的数据表的情况下,尝试这样的事情;

--CREATE TABLE #TEMP (User_ID int, type int)
--INSERT INTO #TEMP VALUES (1,1),(1,2),(1,2),(1,3),(2,2),(2,4)

SELECT User_id, type, count(User_ID) as count FROM #TEMP
group by user_ID, type

我明白了;

User_id type    count
1       1       1
1       2       2
2       2       1
1       3       1
2       4       1
于 2017-04-28T09:41:16.970 回答