0

我正在编写一个将在 .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), 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

顺便说一句,这些就像公共汽车时刻表。有谁知道实现这一目标的好方法?

4

1 回答 1

4

在查询之前查看数据会更容易,但如果要使用现有查询,可以执行以下操作:

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

由于您尝试使用PIVOT两列,因此最简单的方法是先UNPIVOT使用KalkisDonus列,然后将 应用于PIVOT数据。

这是一个带有演示的 SQL Fiddle(不包括您的原始查询)

于 2012-09-27T10:29:07.150 回答