Сгладить строки в SQL Server - PullRequest
       17

Сгладить строки в SQL Server

0 голосов
/ 28 февраля 2012

Мне нужно выровнять или свернуть строки из обеих таблиц, прежде чем я смогу объединить обе таблицы и выполнить вычисления

ТАБЛИЦА - A

StartDate   EndDate        ValueA

2/1/2012    2/1/2012    1

2/2/2012    2/2/2012    2

2/3/2012    2/3/2012    3

2/7/2012    2/8/2012    4

ТАБЛИЦА - B

startdate   enddate        ValueB

2/1/2012    2/1/2012    4

2/2/2012    2/3/2012    5

2/7/2012    2/7/2012    6

2/8/2012    2/8/2012    7**

РЕЗУЛЬТАТ

StartDate   EndDate        ValueA   ValueB

2/1/2012    2/1/2012    calc    calc

2/2/2012    2/3/2012    calc    calc

2/7/2012    2/8/2012    calc    calc

для записи в таблице A: если в таблице B есть несколько записей, которые находятся в начале и в конце EndDAte таблицы A, то мне нужно «сгладить» или «свернуть» эти записи в таблице B, прежде чем я смогу присоединиться к Таблица A для выполнения моих расчетов

Точно так же, такое же условие может существовать и другим способом, так что таблица A имеет несколько записей, которые попадают в Start и EndDate таблицы B, поэтому в этом случае мне нужно сгладить эти записи в таблице A так, чтобы она соответствовала Дата начала и окончания таблицы B.

Я могу добиться этого, используя несколько курсоров, но производительность жалкая, и я надеюсь, что кто-то сможет найти лучшее решение этой проблемы

Надеюсь, мой вопрос имеет смысл для вас, ребята

Заранее спасибо

1 Ответ

2 голосов
/ 28 февраля 2012

Дайте этому шанс (проб. Не самый эффективный ... как я спешил):

drop table tablea
drop table tableb

CREATE TABLE TableA (startdate DATE, enddate DATE, value INT)
CREATE TABLE TableB (startdate DATE, enddate DATE, value INT)

INSERT TableA SELECT '2/1/2012', '2/1/2012', 1
INSERT TableA SELECT '2/2/2012', '2/2/2012', 2
INSERT TableA SELECT '2/3/2012', '2/3/2012', 3
INSERT TableA SELECT '2/7/2012', '2/8/2012', 4


INSERT TableB SELECT '2/1/2012', '2/1/2012', 4
INSERT TableB SELECT '2/2/2012', '2/3/2012', 5
INSERT TableB SELECT '2/7/2012', '2/7/2012', 6
INSERT TableB SELECT '2/8/2012', '2/8/2012', 7


;WITH tablea_cte AS (
  SELECT
    StartDate
    , EndDate
  FROM
    TableA a
  WHERE EXISTS (SELECT * FROM TableB b WHERE b.startdate >= a.startdate and b.enddate <= a.enddate)  
),
tableb_cte as (
  SELECT
    StartDate
    , EndDate
  FROM
    TableB b
  WHERE EXISTS (SELECT * FROM TableA a WHERE a.startdate >= b.startdate and a.enddate <= b.enddate)  
),
tableab_cte AS (
  SELECT * FROM  tableb_cte union select * FROM tablea_cte
),
sumab_cte as (
  SELECT
    ab.startdate
    , ab.enddate
    , calcA = (SELECT SUM (value) FROM TableA a where a.startdate >= ab.startdate and a.enddate <= ab.enddate)
    , calcB = (SELECT SUM (value) FROM TableB b where b.startdate >= ab.startdate and b.enddate <= ab.enddate)
  FROM
    tableab_cte ab
)
select * from sumab_cte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...