2016-08-16 3 views
-1

У меня есть таблица, в которой хранится годовая стоимость, а также значение для каждого месяца календаря (с января по декабрь).Как сравнить значение столбца с несколькими другими значениями столбцов

Я хотел бы легко проверить значение во всех столбцах за 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; 

EDIT
Это, кажется, работает хорошо для того, что я пытаюсь сделать. Спасибо пользователю 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) 
+2

Не могли бы вы показать выборочные данные и ожидаемый результат – TheGameiswar

+0

вы просто пытаетесь увидеть, если они одинаковы? Как и в, вы просто ищете ответ «да/нет» или вам нужно знать, какие столбцы имеют одинаковые значения? – Jackson

+0

Если вы только пытаетесь получить да/нет, чтобы «все они одинаковы», возьмите союз за строкой, размер массива скажет вам, сколько уникальных значений есть (1 подразумевает, что они все одинаковы) – Jackson

ответ

2

Если вы хотите, чтобы проверить это для каждой новой вставки, я предлагаю имеющий триггер лучшего way.having триггера, который информирует вас каждую новую строку, которая включает в себя различных значений в течение 12 месяцев. Если бы это была существующая хранимая процедура данных, это был бы самый простой способ.

+0

Да, эта работа для вставки в БД. Тем не менее, ваш ответ показал, что я не достаточно четко сформулировал свой вопрос. Я обновил его, чтобы отразить, что я ищу, чтобы сделать это через 'SELECT'. – Russ

+1

Попробуйте этот http://dba.stackexchange.com/questions/104521/compare-4-or-more-columns-values. Крест применяется. –

+0

Кажется, что «CROSS APPLY» работает хорошо. – Russ

0

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

Это возвращает все строки, в которых Jan-Dec являются одинаковыми.

Не уверен, что цель именно по-прежнему, но вы можете взять его на шаг дальше и превратить его в UPDATE вместо этого, изменяя AnnualValue для строк, где все 12 месяц колонны одинаковы:

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

+0

К сожалению, SQL Server не нравится синтаксис 'column = column = column'. Управление колонкой «AnnualValue» уже позабочено. Я пытаюсь просто проверить, что данные хороши с помощью операторов SELECT. – Russ

+0

Как насчет 'columnA = columnB и columnA = columnC'? – Jackson

+0

Или вы имеете в виду, что SQL Server не принимает 'column = column' type-wise – Jackson

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

любой нуль вернет ложь