spe*_*raz 4 sql-server sql-server-2000
我想获得连续多列的最小值和最大值。我使用 CROSS APPLY、UPIVOT 和 VALUES 找到了各种工作查询,例如:
select column1, column2, code1,
(qty2), (qty3), (qty4), (qty5),
MinVal, MaxVal
from dummydata
cross apply (select MIN(NULLIF (d ,0)) MinVal,
Max(d) MaxVal
FROM (VALUES (qty2),
(qty3),
(qty4),
(qty5)
) AS a(d)
) A
Run Code Online (Sandbox Code Playgroud)
这些都在 SQL Server 2005 或更高版本中工作,但我需要 SQL Server 2000(数据库兼容级别 80)的解决方案。我怎样才能做到这一点?
DDL:
CREATE TABLE [dbo].[dummydata](
[column1] [nvarchar](255) NULL,
[column2] [nvarchar](255) NULL,
[code1] [nvarchar](255) NULL,
[qty2] [float] NULL,
[qty3] [float] NULL,
.......
[qty20] [float] NULL)
Run Code Online (Sandbox Code Playgroud)
查询输出:
它不会很漂亮(而且我没有 2000 安装要测试),但这应该可行。
的pk是PRIMARY KEY该表(或以一列的UNIQUE NOT NULL约束):
SELECT d.column1, d.column2, d.code1,
d.qty2, d.qty3, d.qty4, d.qty5, ..., d.qty20,
m.MinVal, m.MaxVal
FROM
dummydata AS d
JOIN
( SELECT q.pk,
MIN(NULLIF(q.qty, 0)) AS MinVal,
MAX(q.qty) AS MaxVal
FROM
( SELECT pk, qty2 AS qty FROM dummydata UNION ALL
SELECT pk, qty3 FROM dummydata UNION ALL
SELECT pk, qty4 FROM dummydata UNION ALL
SELECT pk, qty5 FROM dummydata UNION ALL
...
SELECT pk, qty20
) AS q
GROUP BY pk
) AS m
ON m.pk = d.pk ;
Run Code Online (Sandbox Code Playgroud)
另一种方法是在SELECT列表中使用相关子查询:
SELECT d.column1, d.column2, d.code1,
d.qty2, d.qty3, d.qty4, d.qty5, ..., d.qty20,
( SELECT MIN(NULLIF(q.qty, 0))
FROM
( SELECT d.qty2 AS qty UNION ALL
SELECT d.qty3 UNION ALL
...
SELECT d.qty20
) AS q
) AS MinVal,
( SELECT MAX(q.qty)
FROM
( SELECT d.qty2 AS qty UNION ALL
SELECT d.qty3 UNION ALL
...
SELECT d.qty20
) AS q
) AS MaxVal
FROM
dummydata AS d ;
Run Code Online (Sandbox Code Playgroud)