sql 需要 2 个不同的语句
sql statement that requires 2 distinct
我有一个 table,其中有一个 user_id 和一个 ticket_type。我想创建一个 sql 语句,它将 return 我计算每个 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 Total
user1 3 5 8
user2 1 2 3
user3 6 8 14
示例数据库Table
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)
在没有 table 数据的情况下 运行 关闭,尝试这样的事情;
--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
只是为了展示其他可能性,您可以尝试使用 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
您可以使用以下 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() };
我有一个 table,其中有一个 user_id 和一个 ticket_type。我想创建一个 sql 语句,它将 return 我计算每个 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 Total user1 3 5 8 user2 1 2 3 user3 6 8 14
示例数据库Table
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)
在没有 table 数据的情况下 运行 关闭,尝试这样的事情;
--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
只是为了展示其他可能性,您可以尝试使用 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
您可以使用以下 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() };