动态调整选择字段-PostgreSQL
这是我先前的一个问题: 我好奇的是如何动态调整我的语句。我将使用SQL语句在数据库表中查找引用号。每个参考号可能返回任意数量的结果行,每个结果行都有一组尺寸(长x宽x高)。这就是我目前拥有的:动态调整选择字段-PostgreSQL,sql,postgresql,for-loop,while-loop,Sql,Postgresql,For Loop,While Loop,这是我先前的一个问题: 我好奇的是如何动态调整我的语句。我将使用SQL语句在数据库表中查找引用号。每个参考号可能返回任意数量的结果行,每个结果行都有一组尺寸(长x宽x高)。这就是我目前拥有的: select reference_no, max(case when line_no = 1 then dimensions_length end) length1, max(case when line_no = 1 then dimensions_width end) width1, max(case
select
reference_no,
max(case when line_no = 1 then dimensions_length end) length1,
max(case when line_no = 1 then dimensions_width end) width1,
max(case when line_no = 1 then dimensions_height end) height1,
max(case when line_no = 2 then dimensions_length end) length2,
max(case when line_no = 2 then dimensions_width end) width2,
max(case when line_no = 2 then dimensions_height end) height2,
max(case when line_no = 3 then dimensions_length end) length3,
max(case when line_no = 3 then dimensions_width end) width3,
max(case when line_no = 3 then dimensions_height end) height3
from
table.data
where
reference_no = {reference number}
group by
reference_no;
我需要的是根据参考编号的行数,对每行重复我的max语句。这可能吗?我很好奇是否有一种方法可以使模拟for循环在每一行()上迭代?我不太懂postgresql,但是 您希望获取预透视数据,并根据筛选器中可用的值以不同的方式动态透视它?您可能不会使用直接查询来实现这一点 以下是基本概念:
postgresql pivot
和postgresql unpivot
。您将发现如下结果:(交叉表)
(使用values子句进行交叉连接)
下一次。。。提供您自己的示例数据库结构和示例数据将加快进度。您可以轻松地使用另一个问题的答案(糟糕的形式,先生),并在您已有的代码中添加行(并接受空值)
这就是我目前正在做的事情。问题的关键是看是否有一种方法可以最小化查询并以更编程的方式处理问题。另一个问题是,我不知道应该设置多少,因为可能存在的数量没有上限。所以我想做一个catchall,看看有多少,然后把这个陈述重复很多次。我正在查看你之前的答案,看看是否有我可以使用的信息。
CREATE TABLE #myTable (
[myTableID] INTEGER NOT NULL IDENTITY(1, 1),
[reference_no] VARCHAR(255) NULL,
[line_no] INTEGER NULL,
[dimensions_length] INTEGER NULL,
[dimensions_width] INTEGER NULL,
[dimensions_height] INTEGER NULL
);
GO
INSERT INTO #myTable([reference_no],[line_no],[dimensions_length],[dimensions_width],[dimensions_height])
VALUES
('A1T 9Q5',1,10,2,5)
, ('A1T 9Q5',2,1,3,7)
, ('A1T 9Q5',3,6,3,4)
, ('A1T 9Q5',4,5,10,2)
, ('A2M 6U4',1,10,6,4)
, ('A2M 6U4',2,9,6,8)
, ('A2M 6U4',3,1,8,10)
, ('A2M 6U4',4,7,10,9)
, ('A7E 7Q5',1,3,5,5)
, ('A7E 7Q5',2,6,5,4)
, ('A7E 7Q5',3,2,4,10)
, ('A7E 7Q5',4,1,2,7)
, ('C2W 2D3',1,3,3,7)
, ('C2W 2D3',2,7,3,1)
, ('C2W 2D3',3,5,1,3)
, ('C2W 2D3',4,4,6,2)
, ('C7M 0L0',1,7,2,8)
, ('C7M 0L0',2,9,6,8)
, ('C7M 0L0',3,10,6,7)
, ('C7M 0L0',4,8,1,2)
, ('E2R 6G6',1,9,2,5)
, ('E2R 6G6',2,3,10,10)
, ('E2R 6G6',3,5,8,7)
, ('E2R 6G6',4,6,9,6)
, ('F2J 1X1',1,7,2,6)
, ('F2J 1X1',2,2,5,4)
, ('F2J 1X1',3,8,3,4)
, ('F2J 1X1',4,7,8,10)
, ('F7Q 8X4',1,7,1,5)
, ('F7Q 8X4',2,9,7,6)
, ('F7Q 8X4',3,7,9,4)
, ('F7Q 8X4',4,6,7,4)
, ('G1U 1K7',1,1,9,3)
, ('G1U 1K7',2,7,7,3)
, ('G1U 1K7',3,8,10,4)
, ('G1U 1K7',4,7,2,6)
, ('J6J 5H5',1,7,8,7)
, ('J6J 5H5',2,5,2,4)
, ('J6J 5H5',3,3,8,4)
, ('J6J 5H5',4,10,10,5)
, ('J5G 6W7',1,1,7,7)
, ('J5G 6W7',2,9,3,10)
, ('J5G 6W7',3,2,7,1)
, ('J5G 6W7',4,5,5,10)
, ('L3W 6T8',1,10,1,7)
, ('L3W 6T8',2,2,3,3)
, ('L3W 6T8',3,3,7,10)
, ('L3W 6T8',4,5,9,10)
, ('L9T 8I1',1,10,4,6)
, ('L9T 8I1',2,4,9,4)
, ('L9T 8I1',3,2,2,1)
, ('L9T 8I1',4,4,5,7)
, ('N6B 3N5',1,10,6,10)
, ('N6B 3N5',2,10,5,9)
, ('N6B 3N5',3,9,3,10)
, ('N6B 3N5',4,7,8,8)
, ('N6B 3N5',5,6,9,8)
, ('P1L 1M5',1,1,9,9)
, ('P1L 1M5',2,9,4,8)
, ('P1L 1M5',3,3,3,4)
, ('P1L 1M5',4,5,2,5)
, ('Q4D 7I0',1,8,7,5)
, ('Q4D 7I0',2,10,7,7)
, ('Q4D 7I0',3,2,5,3)
, ('Q4D 7I0',4,6,2,4)
, ('Q4D 7I0',5,2,10,5)
, ('R1P 6J1',1,2,8,3)
, ('R1P 6J1',2,2,10,6)
, ('R1P 6J1',3,2,9,4)
, ('R1P 6J1',4,2,6,8)
, ('V2B 7A4',1,1,9,8)
, ('V2B 7A4',2,10,2,4)
, ('V2B 7A4',3,8,10,10)
, ('V2B 7A4',4,5,7,5)
, ('V2B 7A4',5,4,1,9)
, ('S3H 1V5',1,8,2,1)
, ('S3H 1V5',2,2,4,5)
, ('S3H 1V5',3,3,8,5)
, ('S3H 1V5',4,2,5,6)
, ('W3J 5E0',1,4,2,9)
, ('W3J 5E0',2,2,6,10)
, ('W3J 5E0',3,10,3,9)
, ('W3J 5E0',4,5,5,1)
, ('X7M 6D2',1,10,6,3)
, ('X7M 6D2',2,1,6,7)
, ('X7M 6D2',3,2,7,8)
, ('X7M 6D2',4,8,3,6)
, ('Z2M 1Q5',1,4,3,7)
, ('Z2M 1Q5',2,6,7,7)
, ('Z2M 1Q5',3,9,2,4)
, ('Z2M 1Q5',4,2,6,4)
, ('Y7T 4V4',1,2,7,8)
, ('Y7T 4V4',2,9,5,9)
, ('Y7T 4V4',3,10,8,9)
, ('Z9N 3I6',1,3,7,9)
, ('Z9N 3I6',2,6,9,2)
, ('Z9N 3I6',3,1,7,8)
, ('U8E 9O6',1,10,10,7)
, ('U8E 9O6',2,7,1,4)
, ('U8E 9O6',3,4,7,1)
;
/*
select reference_no
, line_no
, max(case when line_no = 1 then dimensions_height end) height1
, max(case when line_no = 2 then dimensions_height end) height2
, max(case when line_no = 3 then dimensions_height end) height3
, max(case when line_no = 1 then dimensions_length end) length1
, max(case when line_no = 2 then dimensions_length end) length2
, max(case when line_no = 3 then dimensions_length end) length3
, max(case when line_no = 1 then dimensions_width end) width1
, max(case when line_no = 2 then dimensions_width end) width2
, max(case when line_no = 3 then dimensions_width end) width3
from #myTable
where reference_no in ('U8E 9O6', 'V2B 7A4', 'L3W 6T8', 'C2W 2D3')
group by reference_no
, line_no
order by 1, 2
;
*/
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
declare @refno varchar(50)
set @refno = 'U8E 9O6'
--set @refno = 'V2B 7A4'
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(col)
FROM (SELECT distinct p.col FROM (
select reference_no
, dim + cast(line_no as varchar(50)) as col
, val
from (
select reference_no
, line_no
, dimensions_length as length
, dimensions_width as width
, dimensions_height as height
from #myTable
where reference_no = @refno
) a
unpivot (
val for dim in (length, width, height)
) as unpvt
) AS p
GROUP BY p.col) AS x;
print @columns
SET @sql = N'
SELECT p.reference_no, ' + STUFF(@columns, 1, 2, '') + '
FROM (
SELECT p.reference_no, p.col, p.val
FROM (
select reference_no
, dim + cast(line_no as varchar(50)) as col
, val
from (
select reference_no
, line_no
, dimensions_length as length
, dimensions_width as width
, dimensions_height as height
from #myTable
where reference_no = ''' + @refno + '''
) a
unpivot (
val for dim in (length, width, height)
) as unpvt
) AS p
) AS j
PIVOT (
max(val) FOR col IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;
drop table #myTable
select
reference_no,
max(case when line_no = 1 then dimensions_length end) length1,
max(case when line_no = 1 then dimensions_width end) width1,
max(case when line_no = 1 then dimensions_height end) height1,
max(case when line_no = 2 then dimensions_length end) length2,
max(case when line_no = 2 then dimensions_width end) width2,
max(case when line_no = 2 then dimensions_height end) height2,
max(case when line_no = 3 then dimensions_length end) length3,
max(case when line_no = 3 then dimensions_width end) width3,
max(case when line_no = 3 then dimensions_height end) height3,
max(case when line_no = 1 then dimensions_length end) length4,
max(case when line_no = 1 then dimensions_width end) width4,
max(case when line_no = 1 then dimensions_height end) height4,
max(case when line_no = 2 then dimensions_length end) length5,
max(case when line_no = 2 then dimensions_width end) width5,
max(case when line_no = 2 then dimensions_height end) height5,
max(case when line_no = 3 then dimensions_length end) length6,
max(case when line_no = 3 then dimensions_width end) width6,
max(case when line_no = 3 then dimensions_height end) height6
-- etc. to the maximum expected number of line_no values
from
table.data
where
reference_no = {reference number}
group by
reference_no;