Многокритериальный регистр в SQL Server 2005 - PullRequest
0 голосов
/ 01 ноября 2011

Я работаю над вычисляемым столбцом, который будет возвращать «X», если соблюдены определенные критерии. Критерии основаны в трех столбцах. Таблица на самом деле имеет несколько столбцов.

COLUMN1     COLUMN2     COLUMN3     DATE
1234          100         300       1/1/2002
2245          100         500       2/3/2002   
1234          400         400       4/5/2007
2256          100         500       7/5/2010
1234         

Возвращается вычисленный столбец, и x, если COLUMN1 имеет значение 1234 ИЛИ ЕСЛИ COLUMN2 имеет 2 последовательных значения <200 в течение 2-летнего периода, или COLUMN3 имеет 2 последовательных значения> 300 в течение 2-летнего периода

В соответствии с этим критерием строки 1,3 и 5 возвращают X из-за числа 1234. Согласно столбцу 2 строка 1 будет возвращать X из-за того, что в течение двухлетнего периода было значение меньше 200 дважды подряд.

Любая помощь будет принята с благодарностью ....

1 Ответ

0 голосов
/ 01 ноября 2011

Это может быть довольно медленно на больших объемах данных из-за самостоятельного объединения, но должно предоставить вам данные, которые вы ищете ...

CREATE TABLE #data
(column1 INT
,column2 INT
,column3 INT
,column4 DATETIME)
INSERT INTO #data 
SELECT 1234         , 100    ,     300     ,'1/1/2002' UNION ALL
SELECT 2245        ,  100    ,     500     ,'2/3/2002'  UNION ALL
SELECT  1234      ,    400   ,      400     ,' 4/5/2007' UNION ALL
SELECT 2256      ,    100    ,     500      ,'7/5/2010' UNION ALL
SELECT 1234     , NULL,NULL,NULL

;with CTE AS
(
SELECT * 
,row_number() OVER (ORDER BY CASE WHEN column4 IS NULL THEN 0 ELSE 1 END DESC) as row
FROM #data
)
SELECT DISTINCT 
c1.row
,c1.column1
,c1.column2
,c1.column3
,c1.column4
,CASE WHEN DATEDIFF(YY,c1.column4,c2.column4) < 2 AND c1.column2 < 200 AND c2.column2 < 200 THEN 'X'
        WHEN c1.column1 = 1234 THEN 'X'
        WHEN DATEDIFF(YY,c1.column4,c2.column4) < 2 AND c1.column3 > 300 AND c2.column3 > 300 THEN 'X' 
        END AS column5
FROM CTE c1
LEFT OUTER JOIN CTE c2
ON c1.row + 1 = c2.row 
ORDER BY c1.row ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...