首页 > 解决方案 > sql - 将行转换为列

问题描述

我有以下表结构:

ID  ADDRESS                     SALEPRICE   PRICEPERAREA    APPRAISALREPORTID
1       2560 W Central Ave      115000      98.46                   1
2       543 N Logan             110000      94.18                   1
3       321 Wall Street         115000      98.46                   1
4       5441 N East Road        125000      94.65                   2
5       2635 N Califnia Ave     118000      92.35                   2
6       1526 W 18th Place       12000       91.54                   2

我希望输出看起来像这样:

在此处输入图像描述

在这里,我没有转换values为,columns而是我希望值将成为记录的一部分。

我查看了多篇关于pivot&的文章,cross apply但无法理解它将如何帮助我。

关于数据的一些fatcs:

在 SQL Server 中使用“透视”将行转换为列

标签: sqlsql-serverpivot

解决方案


您可以尝试在子查询或 CTE 中Row_number使用窗口函数,然后通过Condition Aggregate function进行旋转。

测试DLL

CREATE TABLE T(
 ID INT,
  ADDRESS VARCHAR(50),
  SALEPRICE INT,
  PRICEPERAREA FLOAT,
  APPRAISALREPORTID INT
);


INSERT INTO T VALUES (1,'2560 W Central Ave ',115000,98.46,1);
INSERT INTO T VALUES (2,'543 N Logan',110000,94.18,1);                   
INSERT INTO T VALUES (3,'321 Wall Street',115000,98.46,1);
INSERT INTO T VALUES (4,'5441 N East Road',125000,94.65,2);
INSERT INTO T VALUES (5,'2635 N Califnia Ave',118000,92.35,2);
INSERT INTO T VALUES (6,'1526 W 18th Place',12000 ,91.54, 2);

查询 1

with cte as(
  SELECT *,ROW_NUMBER() OVER(PARTITION BY APPRAISALREPORTID ORDER BY ID) rn
   FROM T
)

SELECT APPRAISALREPORTID,
      MAX(CASE WHEN rn = 1 then ADDRESS end) 'ADDRESS1',  
      MAX(CASE WHEN rn = 1 then SALEPRICE end) 'SALEPRICE1',  
      MAX(CASE WHEN rn = 1 then PRICEPERAREA end) 'PRICEPERAREA1',
      MAX(CASE WHEN rn = 2 then ADDRESS end) 'ADDRESS2',  
      MAX(CASE WHEN rn = 2 then SALEPRICE end) 'SALEPRICE2',  
      MAX(CASE WHEN rn = 2 then PRICEPERAREA end) 'PRICEPERAREA2',
      MAX(CASE WHEN rn = 3 then ADDRESS end) 'ADDRESS3',  
      MAX(CASE WHEN rn = 3 then SALEPRICE end) 'SALEPRICE3',  
      MAX(CASE WHEN rn = 3 then PRICEPERAREA end) 'PRICEPERAREA3'
FROM CTE
group by APPRAISALREPORTID

结果

| APPRAISALREPORTID |            ADDRESS1 | SALEPRICE1 | PRICEPERAREA1 |            ADDRESS2 | SALEPRICE2 | PRICEPERAREA2 |          ADDRESS3 | SALEPRICE3 | PRICEPERAREA3 |
|-------------------|---------------------|------------|---------------|---------------------|------------|---------------|-------------------|------------|---------------|
|                 1 | 2560 W Central Ave  |     115000 |         98.46 |         543 N Logan |     110000 |         94.18 |   321 Wall Street |     115000 |         98.46 |
|                 2 |    5441 N East Road |     125000 |         94.65 | 2635 N Califnia Ave |     118000 |         92.35 | 1526 W 18th Place |      12000 |         91.54 |

推荐阅读