SQL заявление, которое требует 2 различных
У меня есть таблица, где есть user_id и ticket_type. я хочу создать SQL-оператор, который будет возвращать мне счетчик каждого тикета типа, который генерирует каждый user_id.
я придумал это, но это включает в себя некоторое жесткое кодирование 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 Всего user1 3 5 8 user2 1 2 3 user3 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)
3 ответа
Вы можете использовать следующий запрос 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() };
Просто, чтобы показать другую возможность, вы можете попробовать использовать оператор PIVOT. Вы должны определить имя только в одном месте (оператор поворота). Я включил, например, третий тип билета (плюс столбец с итогом). Если вы хотите избежать NULL и переименовать поля (тип заявки), вы должны использовать COALESCE и псевдонимы для каждого поля во внешнем SELECT
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
При отсутствии таблицы данных для запуска попробуйте что-то вроде этого;
--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