【发布时间】:2021-11-18 19:33:04
【问题描述】:
我有下一个数据
| User | Day |
|---|---|
| User1 | Monday |
| User2 | Monday |
| User3 | Monday |
| User2 | Tuesday |
| User3 | Tuesday |
我正在寻找将产生下一个结果的查询
| User | Monday | Tuesday |
|---|---|---|
| User1 | 1 | 0 |
| User2 | 1 | 1 |
| User3 | 1 | 1 |
【问题讨论】:
我有下一个数据
| User | Day |
|---|---|
| User1 | Monday |
| User2 | Monday |
| User3 | Monday |
| User2 | Tuesday |
| User3 | Tuesday |
我正在寻找将产生下一个结果的查询
| User | Monday | Tuesday |
|---|---|---|
| User1 | 1 | 0 |
| User2 | 1 | 1 |
| User3 | 1 | 1 |
【问题讨论】:
您可以使用如下所示的枢轴;
WITH q AS (
SELECT aUser = 'User1', aDay = 'mon', aCount = 1
UNION ALL SELECT 'User1','mon',1
UNION ALL SELECT 'User1','mon',1
UNION ALL SELECT 'User2','mon',1
UNION ALL SELECT 'User3','tue',1
UNION ALL SELECT 'User2','wed',1
UNION ALL SELECT 'User3','thu',1
UNION ALL SELECT 'User2','thu',1
UNION ALL SELECT 'User2','thu',1
UNION ALL SELECT 'User2','mon',1
)
SELECT aUser
, mon = ISNULL(mon,0)
, tue = ISNULL(tue,0)
, wed = ISNULL(wed,0)
, thu = ISNULL(thu,0)
, fri = ISNULL(fri,0)
, sat = ISNULL(sat,0)
, sun = ISNULL(sun,0)
FROM (
SELECT *
FROM q
) s
PIVOT (sum(aCount) FOR aDay IN (mon,tue,wed,thu,fri,sat,sun)) pvt
【讨论】:
您可以使用 PIVOT 来更改带有列的行:
就这两天:
SELECT *
FROM (
SELECT [day], [user]
FROM table1
) as s
PIVOT
(
count([day])
FOR [day] IN (Monday, Tuesday)
)AS pvt
一周中的所有日子:
SELECT *
FROM (
SELECT [day], [user]
FROM table1
) as s
PIVOT
(
count([day])
FOR [day] IN (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
)AS pvt
【讨论】:
我使用条件聚合方法比 PIVOT 方法更好,因为我觉得它的语法不那么复杂,限制也少(效率也不差)。
select [User],
SUM(case when Day = 'Monday' then 1 else 0 end) Monday,
SUM(case when Day = 'Tuesday' then 1 else 0 end) Tuesday
from YourTable
group by [User]
顺便说一句,你不应该使用User作为字段名,因为它是一个保留字。
DBFiddle:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=1f7d06eaa4ac8f23498a71ff552a6a4f
【讨论】: