2013-04-28 1 views
0

Пожалуйста, смотрите SQL скрипку здесь полезные, например: http://sqlfiddle.com/#!3/6d04f/1Осложнения строительства результата с помощью группы по заданному набору данных

У меня есть 4 таблицы, TABLEA, TableB, TableC и внесенному.

TABLEA данные и структура:

+--------------------+ 
| ID | Name   | 
+--------------------+ 
| 987 | Mississauga | 
| 454 | Hoboken  | 
| 343 | Berkeley  | 
+--------------------+ 

данные TableB и структура:

+------------------------------------------------------------+ 
| City1ID | City1Name  | City2ID | City2Name  | Factor | 
+------------------------------------------------------------+ 
| 343  | Berkeley  | 19  | Oakland  | 0.5 | 
| 987  | Mississauga | 23  | Toronto  | 1.0 | 
| 66  | Redmond  | 13  | Seattle  | 1.0 | 
| 343  | Berkeley  | 14  | San Jose  | 0.5 | 
| 454  | Hoboken  | 55  | New York City | 0.9 | 
| 454  | Hoboken  | 44  | Philadelphia | 0.1  
| 19  | Oakland  | 9  | San Francisco | 1.0 | 
... 
+------------------------------------------------------------+ 

TableC: таблица, которая имеет почасовые данные для городов на каждый день года. Не все города находятся в TableC. Таблица A представляет собой небольшое подмножество городов, для которых существует сопоставление в TableB. В моем случае TableA имеет 439 городов (строк), а TableB имеет 7000 строк сопоставлений.

Структура TableC выглядит следующим образом:

+------------------------------------------------------------------------+ 
|Date | CID | Name | Blah1 | Blah2 | Hour1 | Hour2 | Hour3 | ... | Hour24 | 
+------------------------------------------------------------------------+ 

Вот пример стоимости одного дня данных для TableC:

2006-08-01 00:00:00 9 San Francisco Blah1 Blah2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
2006-08-01 00:00:00 23 Toronto Blah1 Blah2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2006-08-01 00:00:00 13 Seattle Blah1 Blah2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 
2006-08-01 00:00:00 14 San Jose Blah1 Blah2 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
2006-08-01 00:00:00 55 New York City Blah1 Blah2 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 
2006-08-01 00:00:00 44 Philadelphia Blah1 Blah2 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 

Для иллюстрации, город Окленд нет в TableC. Однако ежечасные данные наблюдений для Беркли производятся путем суммирования (0,5 х данных для Сан-Хосе и 0,5 х данных для Окленда).

внесенная Структура:

+----------------------------------+ 
| Date | ID | Name | Hour | Value | 
+----------------------------------+ 

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

В моем примере HOUR 1 должен выглядеть следующим образом: Mississauga = 2.0 (1 x Toronto = 1 x 2 = 2), Hoboken = 5,10 (0,9 x Нью-Йорк + 0,1 x Филадельфия = 0,9 x 5 + 0,1 х 6 = 5.10), и Беркли = 2,50 (0,5 х Сан-Хосе + 0,5 х Oakland = 0,5 х 4 + 0,5 х Сан-Франциско = 0,5 х 4 + 0,5 х 1 = 2,50):

+--------------------------------------------------------+ 
| Date    | ID |  Name | Hour | Value | 
+--------------------------------------------------------+ 
| 2006-08-01 00:00:00 | 987 | Mississauga | 1 | 2.00 | 
| 2006-08-01 00:00:00 | 454 | Hoboken  | 1 | 5.10 | 
| 2006-08-01 00:00:00 | 343 | Berkeley | 1 | 2.50 | 
+--------------------------------------------------------+ 

Теперь, сложной частью является Окленд нет в TableC, и вместо этого он отображается в Сан-Франциско, поэтому любой город, который отображается в Окленде, должен ссылаться на город, к которому он привязан. В моей ситуации есть много ситуаций, когда это происходит, поэтому я хочу убедиться, что это правильно.

Я добрался до стандартного стола TableC и присоединился к нему с таблицей B, но не уверен, как действовать дальше. Я знаю, что мне нужно использовать Group By, но не знаю, как это сделать с предостережением, которое я описал.

select * from 
(
    select Date, CID, Name, replace(Details, 'Hour', '') as Hour, ObservationValue 
    from TableC 
    as Result 
    unpivot 
    (
     ObservationValue for Details in ([Hour1], [Hour2], [Hour3], [Hour4], [Hour5], [Hour6], 
     [Hour7],[Hour8],[Hour9],[Hour10],[Hour11],[Hour12],[Hour13],[Hour14], 
     [Hour15],[Hour16],[Hour17],[Hour18],[Hour19],[Hour20],[Hour21],[Hour22], 
     [Hour23],[Hour24]) 
) 
as UnPvt 
) as resultX 
join TableB as b on (b.City2ID = resultX.CID) 

Если вы не можете получить доступ к ссылке SQL скрипку ниже приведен код для создания схемы:

CREATE TABLE TableA 
    ([Id] int, [name] varchar(20)); 

INSERT INTO TableA 
    ([Id], [name]) 
VALUES 
    (987, 'Mississauga'), 
    (454, 'Hoboken'), 
    (343, 'Berkeley'); 

CREATE TABLE TableB 
    ([City1ID] int, [City1Name] varchar(20), 
    [City2ID] int, [City2Name] varchar(20), [Factor] varchar(20)) 

INSERT INTO TableB 
    ([City1ID], [City1Name],[City2ID], [City2Name], [Factor]) 
VALUES 
    (343, 'Berkeley', 19, 'Oakland', 0.5), 
    (987, 'Mississauga', 23, 'Toronto', 1.0), 
    (66, 'Redmond', 13, 'Seattle', 1.0), 
    (343, 'Berkeley', 14, 'San Jose', 0.5), 
    (454, 'Hoboken', 55, 'New York City', 0.9), 
    (454, 'Hoboken', 44, 'Philadephia', 0.1), 
    (19, 'Oakland', 9, 'San Francisco', 1.0); 

CREATE TABLE TableC 
    ([date] datetime, [CId] int, [name] varchar(50), [blah1] varchar(10), 
    [blah2] varchar(10), [hour1] int, [hour2] int, [hour3] int, [hour4] int, 
    [hour5] int, [hour6] int, [hour7] int, [hour8] int, [hour9] int, 
    [hour10] int,[hour11] int, [hour12] int, [hour13] int, [hour14] int, 
    [hour15] int, [hour16] int, [hour17] int, [hour18] int, [hour19] int, 
    [hour20] int, [hour21] int, [hour22] int, [hour23] int, [hour24] int); 

INSERT INTO TableC 
    ([date], [CId], [name], [blah1], 
    [blah2], [hour1], [hour2], [hour3], [hour4], 
    [hour5], [hour6], [hour7], [hour8], [hour9], 
    [hour10],[hour11], [hour12], [hour13], [hour14], 
    [hour15], [hour16], [hour17], [hour18], [hour19], 
    [hour20], [hour21], [hour22], [hour23], [hour24]) 

VALUES 
('2006-08-01 00:00:00', 9, 'San Francisco', 'Blah1', 'Blah2', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), 
('2006-08-01 00:00:00', 23,'Toronto', 'Blah1', 'Blah2', 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), 
('2006-08-01 00:00:00', 13,'Seattle', 'Blah1', 'Blah2', 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), 
('2006-08-01 00:00:00', 14,'San Jose', 'Blah1', 'Blah2', 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4), 
('2006-08-01 00:00:00', 55,'New York City', 'Blah1', 'Blah2', 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5), 
('2006-08-01 00:00:00', 44,'Philadelphia', 'Blah1', 'Blah2', 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6); 
+0

слишком сложный вопрос для меня, пожалуйста попробуйте извлечь более простые подзапросы с упрощенными структурами данных, например, удалив ненужную логику «без ключа» и сохраните только один часовой столбец. В противном случае ответ будет есть слишком много времени – shibormot

+0

В этом случае важна моя структура данных. – codingknob

ответ

1

это будет делать with your data and structure

select  date,cityid, cityname,hr, sum(hour1) as total 
from 
      (
       select c.Date as date, 
         isnull(a.id,parent.city1id) as cityid, 
         isnull(a.name,parent.city1name) as cityname, 
         isnull(parent.factor,1) *   --- parent factor 
         b.factor * --- actual factor 
         isnull(c.hour1,0) as hour1 , 
         1 as hr 

       from tablea a 
       right outer join tableb b on b.city1id = a.[id] 
       left outer join tableb parent on parent.city2id=b.city1id 
       left outer join tablec c on c.cid = isnull(b.city2id,b.city1id) 
      ) final 
where  date is not null and cityid is not null 
group by cityid,cityname,date,hr 
+0

Привет! Спасибо за помощь.Дело в том, как я могу получить «Date, ID, Name, Hour, Value», так как это структура TableA. Он также должен обрабатываться каждый час. – codingknob

+0

О, вы только что изменили свой вопрос – Sankara

+0

на тот же вопрос, ожидайте, что столбец Factor должен быть десятичным. Поэтому я обновил это. В противном случае все остальное в вопросе будет одинаковым. – codingknob

Смежные вопросы