行到列SQL查询
我正在编写一个将在.NET应用程序中使用的查询,因此我希望SQL Server 2008能够为我完成大部分处理工作,而不是运行应用程序的客户端PC 我试图从我连接在一起的一些表中获取数据 以下是一个例子:行到列SQL查询,sql,sql-server,pivot,Sql,Sql Server,Pivot,我正在编写一个将在.NET应用程序中使用的查询,因此我希望SQL Server 2008能够为我完成大部分处理工作,而不是运行应用程序的客户端PC 我试图从我连接在一起的一些表中获取数据 以下是一个例子: SELECT SUBSTRING(CAST(CAST(HCPD.SeferCikisZamani AS TIME) AS VARCHAR), 1, 5) AS Kalkis, SUBSTRING(CAST(CAST(HCPD.DonusZamani AS TIME) AS VARCHAR),
SELECT SUBSTRING(CAST(CAST(HCPD.SeferCikisZamani AS TIME) AS VARCHAR), 1, 5) AS Kalkis, SUBSTRING(CAST(CAST(HCPD.DonusZamani AS TIME) AS VARCHAR), 1, 5) AS Donus, V.AracPlaka
FROM HAT_CALISMA_PLANI HCP WITH(NOLOCK)
INNER JOIN HAT_CALISMA_PLANI_DETAY HCPD WITH(NOLOCK) ON HCPD.HatCalismaPlaniKey = HCP.HatCalismaPlaniKey
INNER JOIN VALIDATOR V WITH(NOLOCK) ON V.ValidatorKey = HCPD.ValidatorKey
WHERE HCP.HatKey = 2 AND CAST(HCPD.SeferCikisZamani AS DATE) = '2012-09-25'
ORDER BY Kalkis
此查询返回以下结果:
Kalkis Donus AracPlaka
-------------------------
01:51 02:01 07 ABY 04
02:02 02:12 07 AB 978
02:21 02:31 07 ABY 04
02:32 02:42 07 AB 978
03:01 03:11 07 ABY 04
03:02 03:12 07 AB 978
03:31 03:41 07 ABY 04
03:42 03:52 07 AB 978
04:01 04:11 07 ABY 04
但是在我的报告中他们应该是这样的
07 ABY 04 07 AB 978
Kalkis 06:15 06:30
Donus 07:45 08:00
Kalkis 08:00 08:10
Donus 09:30 09:40
Kalkis 10:00 10:15
Donus 11:30 11:45
Kalkis 12:30 12:45
Donus 14:00 14:15
顺便说一句,这些都像公共汽车时刻表。
有人知道实现这一点的好方法吗?在查询数据之前查看数据会更容易,但如果要使用现有查询,可以执行以下操作:
select *
from
(
select AracPlaka, val, col,
row_number() over(partition by AracPlaka order by VAL, col) rn
from
(
SELECT SUBSTRING(CAST(CAST(HCPD.SeferCikisZamani AS TIME) AS VARCHAR), 1, 5) AS Kalkis,
SUBSTRING(CAST(CAST(HCPD.DonusZamani AS TIME) AS VARCHAR), 1, 5) AS Donus,
V.AracPlaka
FROM HAT_CALISMA_PLANI HCP WITH(NOLOCK)
INNER JOIN HAT_CALISMA_PLANI_DETAY HCPD WITH(NOLOCK)
ON HCPD.HatCalismaPlaniKey = HCP.HatCalismaPlaniKey
INNER JOIN VALIDATOR V WITH(NOLOCK)
ON V.ValidatorKey = HCPD.ValidatorKey
WHERE HCP.HatKey = 2
AND CAST(HCPD.SeferCikisZamani AS DATE) = '2012-09-25'
-- ORDER BY Kalkis
) x
unpivot
(
val
for col in(Kalkis, Donus)
) u
) x1
pivot
(
max(val)
for AracPlaka In([07 ABY 04], [07 AB 978])
) p
由于您正在尝试对两列进行透视,最简单的方法是首先对Kalkis
和Donus
列进行透视,然后对数据应用PIVOT
以下是一个(不包括原始查询)在查询数据之前查看数据会更容易,但如果要使用现有查询,可以执行以下操作:
select *
from
(
select AracPlaka, val, col,
row_number() over(partition by AracPlaka order by VAL, col) rn
from
(
SELECT SUBSTRING(CAST(CAST(HCPD.SeferCikisZamani AS TIME) AS VARCHAR), 1, 5) AS Kalkis,
SUBSTRING(CAST(CAST(HCPD.DonusZamani AS TIME) AS VARCHAR), 1, 5) AS Donus,
V.AracPlaka
FROM HAT_CALISMA_PLANI HCP WITH(NOLOCK)
INNER JOIN HAT_CALISMA_PLANI_DETAY HCPD WITH(NOLOCK)
ON HCPD.HatCalismaPlaniKey = HCP.HatCalismaPlaniKey
INNER JOIN VALIDATOR V WITH(NOLOCK)
ON V.ValidatorKey = HCPD.ValidatorKey
WHERE HCP.HatKey = 2
AND CAST(HCPD.SeferCikisZamani AS DATE) = '2012-09-25'
-- ORDER BY Kalkis
) x
unpivot
(
val
for col in(Kalkis, Donus)
) u
) x1
pivot
(
max(val)
for AracPlaka In([07 ABY 04], [07 AB 978])
) p
由于您正在尝试对两列进行透视,最简单的方法是首先对Kalkis
和Donus
列进行透视,然后对数据应用PIVOT
这是一个(不包括您的原始查询)感谢您的精彩回答。但它只返回一个Donus和一个Kalkis。它应该像多纳斯,卡尔基斯,多纳斯,卡尔基斯,多纳斯,卡尔基斯
Kalkis 06:15 06:30
中,06:15
和06:3
来自哪里?使用pivot函数并获取结果。使用此链接数据透视表中的时间与原始数据透视表中的时间之间有什么关系?例如,在第一行Kalkis 06:15 06:30
中06:15
和06:3
来自哪里??