【问题标题】:Rows to columns SQL query行到列 SQL 查询
【发布时间】:2012-09-27 10:07:03
【问题描述】:

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

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

【问题讨论】:

标签: sql sql-server pivot


【解决方案1】:

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

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 with Demo(不包括您的原始查询)

【讨论】:

  • 感谢您的精彩回答。但它只返回一个 Donus 和一个 Kalkis。它应该像 Donus, Kalkis, Donus, Kalkis, Donus, Kalkis...col 07 ABY 04 07 AB 978 Donus 04:11 03:52 Kalkis 04:01 03:42
  • @MehmetBudak 你能用每个表的工作数据模型创建一个sql fiddle 吗?然后我可以查看查询并尝试使其正常工作。
  • @MehmetBudak 请查看我的编辑并让我知道它现在是否有效。
  • 你太棒了,我的朋友!你真是太棒了!感谢您的宝贵时间!
  • 最后一个问题@bluefeet,如何动态填充这部分? max(val) for AracPlaka In([07 ABY 04], [07 AB 978])。此信息在此表 VALIDATOR (AracPlaka) 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多