如何将列的值与多个其他列值进行比较

时间:2016-08-16 15:27:40

标签: sql-server tsql

我有一个表格,用于存储每个日历月(1月到12月)的年度价值和价值。

我想轻松检查所有12个月列中的值,并确定每个月之间的值是否相同。每个值列定义为INT并且可以包含NULL值。

SELECT中比较这些列的最简单方法是什么?

CREATE TABLE #FOO
(
    ID INT NOT NULL IDENTITY(1,1),
    YearlyValue INT NULL,
    JanValue INT NULL,
    FebValue INT NULL,
    MarValue INT NULL,
    AprValue INT NULL,
    MayValue INT NULL,
    JunValue INT NULL,
    JulValue INT NULL,
    AugValue INT NULL,
    SepValue INT NULL,
    OctValue INT NULL,
    NovValue INT NULL,
    DecValue INT NULL
);

INSERT INTO #FOO (YearlyValue, JanValue, FebValue, MarValue, AprValue, MayValue, JunValue, JulValue, AugValue, SepValue, OctValue, NovValue, DecValue)
VALUES (NULL, 19, 19, 19, 19, 14, 14, 14, 15, 15, 15, 15, 16)
     , (5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5)
     , (NULL, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5)
;

SELECT * FROM #FOO

DROP TABLE #FOO;

修改
这看起来对我正在尝试做的事情很有效。感谢用户MuthuMK以及其他所有人的帮助。

SELECT D.ID, MIN(A) AS MinValue, MAX(A) AS MaxValue
FROM #FOO AS D
CROSS APPLY
(
    VALUES (D.JanValue), (D.FebValue), (D.MarValue), (D.AprValue), (D.MayValue)
         , (D.JunValue), (D.JulValue), (D.AugValue), (D.SepValue), (D.OctValue)
         , (D.NovValue), (D.DecValue)
) AS X(A)
GROUP BY D.ID
HAVING MIN(A) = MAX(A)

3 个答案:

答案 0 :(得分:2)

如果你想为每个新的插入检查这个,我建议有触发器是最好的方法。有触发器通知你每个新行包括 不同的值12个月。如果是现有数据存储过程将是最简单的方法。

答案 1 :(得分:1)

where JanValue = FebValue
  and JanValue = MarValue  
  and JanValue = AprValue   
...

任何null都将返回false

答案 2 :(得分:0)

SELECT * FROM table WHERE JanValue = FebValue = MarValue = ... = DecValue

这将返回Jan-Dec相同的所有行。

不确定目标究竟是什么,但您可以更进一步将其转换为UPDATE,而是更改所有12个月列相同的行的AnnualValue

UPDATE table SET AnnualValue = JanValue WHERE JanValue = FebValue = MarValue = ... = DecValue