我是一名.net开发人员,除了基本的CRUD之外,没有做很多SQL。
我在SQL Server 2005中有一个表:
CREATE TABLE [dbo].[Cases](
[CasesID] [int] IDENTITY(1,1) NOT NULL,
[Enterprise_Date_Key] [int] NOT NULL,
[Interval_Num] [int] NOT NULL,
[QueueID] [int] NOT NULL,
[TotalCases] [int] NOT NULL,
数据类似于:
4609 3 0 12455 4532
4610 3 0 12452 7963
4625 3 1 12455 4542
4626 3 1 12452 7993
4627 3 2 12455 4552
4628 3 2 12452 7823
.
我运行查询:
set @enterpriseDateKey = 3
select QueueID, interval_num, max(TotalCases)
from Case_Process_Status_Hourly_Fact a
where a.Enterprise_Date_Key = @enterpriseDateKey
group by QueueID,Interval_Num
结果是:
12452 0 4532
12455 0 7963
12452 1 4542
12455 1 7993
12452 2 4552
12455 3 7823
.
.
.
我需要一个查询的帮助,该查询将以不同的方式对数据进行分组,其中间隔为列(X轴),QueueID
在行(Y轴)上分组。如:
12452 4532 4542 4552 . .
12455 7963 7993 7823 . .
我会说实话,我不知道要朝哪个方向取得理想的结果。我不知道是否应该沿着创建多个子查询的路径来获取我的数据,或者是否有任何方法可以进行不同的分组以获得我想要的结果。任何建议都会非常有帮助。
答案 0 :(得分:1)
在SQL Server中,将结果从行转换为列的方法不止一种。在这种情况下,最明显的方法似乎是使用聚合:
select QueueID,
max(case when interval_num = 0 then TotalCases end) as Int0,
max(case when interval_num = 1 then TotalCases end) as Int1,
max(case when interval_num = 2 then TotalCases end) as Int2,
max(case when interval_num = 3 then TotalCases end) as Int3,
. . .
from Case_Process_Status_Hourly_Fact a
where a.Enterprise_Date_Key = @enterpriseDateKey
group by QueueID
这实际上是您的select
子句具有透视列的查询。在SQL中,您必须指定列数,因此请输入您认为必要的数字。
答案 1 :(得分:1)
由于您使用的是SQL Server 2005,因此您还可以实现PIVOT
功能:
select QueueID,
[0] as Int_0,
[1] as Int_1,
[2] as Int_2,
[3] as Int_3
from
(
select QueueID, interval_num, TotalCases
from Case_Process_Status_Hourly_Fact a
where a.Enterprise_Date_Key = @enterpriseDateKey
) src
pivot
(
max(TotalCases)
for interval_num in ([0], [1], [2], [3])
) piv
请记住,如果您拥有未知数量的interval_num
值,您还可以实现动态SQL来执行此数据转换。
答案 2 :(得分:0)
请看一下
http://stackoverflow.com/questions/6267660/sql-query-to-convert-rows-into-columns
它可能对你有所帮助
或者在网上寻找T-SQL。它可以帮助你。