【发布时间】:2012-05-23 12:56:24
【问题描述】:
我正在尝试创建一个动态 Pivot,但似乎无法使其正常工作。
表:
SELECT [CaseID], [ClientID]
from [RegData]
目前返回:
CaseID--|ClientID| RecID
------------------------
7845107 |115172 |410
7845107 |164570 |1197
7845107 |115655 |416
7845107 |154244 |425
7856846 |116684 |151
7856846 |112354 |445
7455444 |115172 |492
7455444 |164570 |518
7455444 |115655 |1297
7455444 |154244 |681
我需要它像这样返回:
CaseID--|Val1----|Val2----|Val3----|Val4----|
7845107 |115172 |164570 |115655 |154244 |
7856846 |116684 |112354 | | |
7455444 |115172 |164570 |115655 |154244 |
然后,我需要找到 CaseID 不同但 VAL1、VAL2、VAL3 等相同的实例。
CaseID--|Val1----|Val2----|Val3----|Val4----|
7845107 |115172 |164570 |115655 |154244 |
7455444 |115172 |164570 |115655 |154244 |
【问题讨论】:
-
您如何确定 164570 是 Val2 而 115655 是 Val3? SQL Server 需要数据支持的某种方式(或可以引入查询的确定性方式)来支持该排序。您在这里的查询没有 ORDER BY,所以我怀疑您假设因为这是这次返回数据的方式,所以这就是它始终返回的顺序?这是一个常见的误解,但它仍然是一个误解。您是否有其他列可以帮助确定您的预期顺序(例如身份或日期/时间列)?
-
嗨亚伦,非常公平。为了尽量减少混乱,我省略了“RecID”列,它实际上是每一行的唯一标识符。
-
那么在您上面的示例中,这些行是按 RecID 排序的吗?通常我们更喜欢完整的信息......我们是聪明的人,混乱通常不会让我们慢下来太多。所以我建议您至少将 RecID 值添加到第一组。
-
他们在第一个表中没有排序。我猜如果需要,列标题可能是 ClientID。也就是说,在返回的示例中,Value1 的列标题可能是“115172”,所有具有“115172”的行都将具有值“115172”。不确定如何找到 CaseID 不同且列标题相同的实例...
-
好的。同样,RecID 和 ClientID 都没有规定顺序。您看到的顺序是任意的(因为您没有 order by),并且在您下次运行查询时它可能会完全改变(当您告诉引擎您不关心时 SQL 选择的顺序可能会根据许多因素而改变)。您想要开发这个基于您当前在这些任意结果中看到的匹配值的数据透视查询,而 SQL Server 不能以这种方式工作。除非你能解释为什么 154244 的两个实例都属于 Value4 列的合乎逻辑的原因,否则恐怕你不走运......
标签: sql-server tsql sql-server-2005 pivot