Sql server 如何对数字范围和排序结果进行透视查询?
我正在寻找一个MS SQL查询(用于SQL Reporting Services),以获得以下结果:Sql server 如何对数字范围和排序结果进行透视查询?,sql-server,pivot,sql-server-2012,Sql Server,Pivot,Sql Server 2012,我正在寻找一个MS SQL查询(用于SQL Reporting Services),以获得以下结果: JobCode 0-10 11-20 21-30 31-40 41-50 A 1 2 0 0 2 B 0 2 2 0 0 C 3 0 1 1
JobCode 0-10 11-20 21-30 31-40 41-50
A 1 2 0 0 2
B 0 2 2 0 0
C 3 0 1 1 0
当前查询:
SELECT RecordID
, CAST(GETDATE() - JobStartDate AS Int) AS DaysSinceStart
, Code
FROM tblJobs
返回以下结果:
RecordID | DaysSinceStart | Code
158987 11 A
158968 3 A
158972 4 C
158973 16 B
158974 23 C
158975 13 B
158976 45 A
158977 32 C
158985 9 C
158981 25 B
158982 47 A
158983 18 A
158978 5 C
158979 27 B
我可以使用以下内容返回总体摘要,但它不允许我按职务代码查看单个结果:
SELECT Range AS [Day Range], COUNT(*) AS Jobs
FROM (SELECT CASE WHEN DaysSinceStart BETWEEN 0 AND 9 THEN ' 0- 9'
WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19'
WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29'
WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39'
WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49'
WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59'
WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69'
WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79'
WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89'
WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99'
ELSE 'Over 100' END AS Range
FROM (SELECT DaysSinceStart
FROM tblJobs) AS derivedtbl_1) AS t
GROUP BY Range
有人能帮我按代码字段分类吗?
非常感谢。
另外,我正在使用MS SQL Server 2012尝试以下方法:
select * from
(SELECT code,Range AS [Day Range], COUNT(*) AS Jobs
FROM (SELECT code,CASE WHEN DaysSinceStart BETWEEN 0 AND 9 THEN '0- 9'
WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19'
WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29'
WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39'
WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49'
WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59'
WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69'
WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79'
WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89'
WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99'
ELSE 'Over 100' END AS Range
FROM (SELECT code,DaysSinceStart
FROM demo) AS derivedtbl_1) AS t
GROUP BY Range,code) q1
pivot
(max(jobs)
for [Day Range] in ([0- 9],[10-19],[20-29],[30-39],[40-49],[50-59],
[60-69],[70-79],[80-89],[90-99],[Over 100])
)as pvt
试试这个-
查询:
SET NOCOUNT ON;
DECLARE @tblJobs TABLE
(
RecordID INT
, DaysSinceStart INT
, Code CHAR(1)
)
INSERT INTO @tblJobs (RecordID, DaysSinceStart, Code)
VALUES
(158987, 11, 'A'), (158968, 3, 'A'),
(158972, 4, 'C'), (158973, 16, 'B'),
(158974, 23, 'C'), (158975, 13, 'B'),
(158976, 45, 'A'), (158977, 32, 'C'),
(158985, 9, 'C'), (158981, 25, 'B'),
(158982, 47, 'A'), (158983, 18, 'A'),
(158978, 5, 'C'), (158979, 27, 'B')
SELECT *
FROM (
SELECT
t.Code
, [Range] =
CASE
WHEN DaysSinceStart BETWEEN 0 AND 9 THEN '0-9'
WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19'
WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29'
WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39'
WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49'
WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59'
WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69'
WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79'
WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89'
WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99'
ELSE 'Over 100'
END
FROM @tblJobs t
) o
PIVOT
(
COUNT(o.[Range])
FOR [Range] IN (
[0-9], [10-19], [20-29],
[30-39], [40-49], [50-59],
[60-69], [70-79], [80-89],
[90-99], [Over 100]
)
) pt
Code 0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 80-89 90-99 Over 100
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
A 1 2 0 0 2 0 0 0 0 0 0
B 0 2 2 0 0 0 0 0 0 0 0
C 3 0 1 1 0 0 0 0 0 0 0
输出:
SET NOCOUNT ON;
DECLARE @tblJobs TABLE
(
RecordID INT
, DaysSinceStart INT
, Code CHAR(1)
)
INSERT INTO @tblJobs (RecordID, DaysSinceStart, Code)
VALUES
(158987, 11, 'A'), (158968, 3, 'A'),
(158972, 4, 'C'), (158973, 16, 'B'),
(158974, 23, 'C'), (158975, 13, 'B'),
(158976, 45, 'A'), (158977, 32, 'C'),
(158985, 9, 'C'), (158981, 25, 'B'),
(158982, 47, 'A'), (158983, 18, 'A'),
(158978, 5, 'C'), (158979, 27, 'B')
SELECT *
FROM (
SELECT
t.Code
, [Range] =
CASE
WHEN DaysSinceStart BETWEEN 0 AND 9 THEN '0-9'
WHEN DaysSinceStart BETWEEN 10 AND 19 THEN '10-19'
WHEN DaysSinceStart BETWEEN 20 AND 29 THEN '20-29'
WHEN DaysSinceStart BETWEEN 30 AND 39 THEN '30-39'
WHEN DaysSinceStart BETWEEN 40 AND 49 THEN '40-49'
WHEN DaysSinceStart BETWEEN 50 AND 59 THEN '50-59'
WHEN DaysSinceStart BETWEEN 60 AND 69 THEN '60-69'
WHEN DaysSinceStart BETWEEN 70 AND 79 THEN '70-79'
WHEN DaysSinceStart BETWEEN 80 AND 89 THEN '80-89'
WHEN DaysSinceStart BETWEEN 90 AND 99 THEN '90-99'
ELSE 'Over 100'
END
FROM @tblJobs t
) o
PIVOT
(
COUNT(o.[Range])
FOR [Range] IN (
[0-9], [10-19], [20-29],
[30-39], [40-49], [50-59],
[60-69], [70-79], [80-89],
[90-99], [Over 100]
)
) pt
Code 0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 80-89 90-99 Over 100
---- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
A 1 2 0 0 2 0 0 0 0 0 0
B 0 2 2 0 0 0 0 0 0 0 0
C 3 0 1 1 0 0 0 0 0 0 0
创建一个派生表/CTE/table variable/temp表,或者创建一个保存间隔的常规表。使用该表在
JobStartDate
和getdate()
之间加入datediff
,以获取间隔。然后可以使用pivot
对每个code
和interval
的值进行计数
with C(low, high, interval) as
(
select 0, 10, '0-10' union all
select 11, 20, '11-20' union all
select 21, 30, '21-30' union all
select 31, 40, '31-40' union all
select 41, 50, '41-50' union all
select 51, 2147483647, 'over 50'
)
select Code, [0-10], [11-20], [21-30], [31-40], [41-50], [over 50]
from (
select J.Code,
J.RecordID,
C.interval
from tblJobs as J
inner join C
on datediff(day, J.JobStartDate, getdate()) between C.low and C.high
) as T
pivot (
count(T.RecordID)
for T.Interval in ([0-10], [11-20], [21-30], [31-40], [41-50], [over 50])
) as P
非常感谢你,拉维,工作做得很好。我的想法和你的想法完全一样。你为什么要删除它?@ErikE在他真正想要的东西被弄清楚之前,我不想卷入混乱的讨论。我会把它拿回去看看会发生什么:)@ErikE同样,如果他在postgresql上,他可以使用这种美。