使用 SQL 每隔一行透视所选值



我有一个表(在SQL Server 2012中),如下所示:

它包含以下字段:

包裹编号:

  • 每个宗地都有一个唯一的标识符,但当房产多次出售时,在我的表中会重复

销售编号:

  • 每个销售ID都是唯一的
  • 销售ID将更大与第二个/第三个/...出售每个包裹 - 这可能用于枢轴?

价格:

  • 每笔销售的价格

销售日期:

  • 我按月对日期进行了编码,以使计算更容易(2010 年 1 月 = 1,2011 年 1 月=13,...

计数:

  • 每个包裹一式两份出现的次数

我想创建一个新表,其中 ParcelID 变得唯一(像这样),并且每个销售都列在其自己的列中。我相信我需要一个支点来解决这个问题...

  • 我相信这将涉及获取每个包裹ID,找到哪个SaleID或SaleDate最低,然后将其分配给Sale1。

如果更容易,我也很乐意使用某种"每隔一行选择"类型的格式一次完成 2 的所有重复(以及 3 次转售、4 等)。

这可能吗?我猜这将涉及一个支点。任何提示将不胜感激!

这样做

是可能的,但这真的不是SQL Server擅长的结构,你必须相当多的技巧才能做到这一点。这里至少有一个示例:

SQL 查询,按运行查询时未知的集进行分组

如果可能的话,我建议使用不同类型的输出格式。

我会添加一个身份列来标准化销售订单 (1,2) 而不是 (1001,1310)。 然后,您可以运行 case 语句来执行透视。 可能有更好的方法来做到这一点,但它将在这个小示例中起作用。 您需要判断有多少数据以及是否值得添加列。

添加销售订单的代码示例:

create table test
(parcelid int
, saleid int
, price int
, saledate int
, count int)
alter table test
  add saleorder int
insert into test (parcelid, saleid, price, saledate) values (1, 1001, 184000, 38)
insert into test (parcelid, saleid, price, saledate) values (1,1310,78000,11)
insert into test (parcelid, saleid, price, saledate) values (2,1102,135000,15)
insert into test (parcelid, saleid, price, saledate) values (2,1103,42000,17)
insert into test (parcelid, saleid, price, saledate) values (3,1100,110000,42)
insert into test (parcelid, saleid, price, saledate) values (3,1306,150000,42)
insert into test (parcelid, saleid, price, saledate) values (3,1401,58500,42)
declare @parcelid varchar(100)
declare c1 cursor
    for select distinct parcelid
      from test
      order by parcelid
open c1
fetch next from c1 into @parcelid
while @@fetch_status = 0
begin
    exec ('
        declare @temp_table table
        ( id int identity(1,1)
        , parcelid int
        , saleid int)
        insert into @temp_table
        select parcelid
          , saleid
          from test
          where parcelid = ' + @parcelid + '
          order by saleid
        update a
          set saleorder = id
          from test a
          join @temp_table tt
            on a.parcelid = tt.parcelid
            and a.saleid = tt.saleid
    ')
    fetch next from c1 into @parcelid
end
close c1
deallocate c1
select *
  from test
  where parcelid = 1
  order by saleid
select parcelid
  , max(case when saleorder = 1 then price end) 'price_1'
  , max(case when saleorder = 1 then saledate end) 'saledate_1'
  , max(case when saleorder = 2 then price end) 'price_2'
  , max(case when saleorder = 2 then saledate end) 'saledate_2'
  , max(case when saleorder = 3 then price end) 'price_3'
  , max(case when saleorder = 3 then saledate end) 'saledate_3'
  --, max(case when saleorder = x then price end) -- add these for the max number of times a parcel has been sold
  --, max(case when saleorder = x then saledate end)
  from test
  group by parcelid
  order by parcelid

最新更新