#sql #postgresql
#sql #postgresql
Вопрос:
Вопрос:
Каковы общие распределения в 2020 году по свойствам, которые были приобретены в 2019 году, с разбивкой по состоянию?
Пока это то, что у меня есть, и, похоже, я не правильно подытоживаю? какой шаг я пропускаю. Я не получаю сообщение об ошибке, но и не получаю ответа? Есть идеи?
CREATE TABLE Property
(
hmy INT NOT NULL,
scode VARCHAR NOT NULL,
saddr1 VARCHAR NOT NULL,
saddr2 VARCHAR NOT NULL,
scity VARCHAR NOT NULL,
sstate VARCHAR NOT NULL,
szipcode INT NOT NULL,
PRIMARY KEY (hmy)
);
CREATE TABLE PropInfo
(
hmy INT NOT NULL,
hcode INT NOT NULL,
acquisitiondate DATE NOT NULL,
unitcount INT NOT NULL,
yearbuilt INT NOT NULL,
distributionentitycode VARCHAR NOT NULL,
PRIMARY KEY (hcode)
);
CREATE TABLE DistributionLog
(
hmy INT NOT NULL,
hcode INT NOT NULL,
distributionDate DATE NOT NULL,
distributiontype VARCHAR NOT NULL,
distributionamount INT NOT NULL,
PRIMARY KEY (hmy)
);
SELECT SUM(DL.distributionamount) AS Total, PY.sstate, PI.acquisitiondate, DL.distributionamount
FROM DistributionLog AS DL
JOIN PropInfo AS PI
ON PI.hmy = DL.hcode
JOIN Property AS PY
ON PY.hmy = PI.hmy
WHERE distributionDate BETWEEN '2020-1-1' AND '2020-12-31'
GROUP BY PY.sstate, PI.acquisitiondate, DL.distributionamount
ORDER BY PY.sstate;
Вот что было опробовано:
Комментарии:
1. Какая таблица сообщает, когда было приобретено свойство? Можете ли вы включить структуру PropInfo и Property, а также описать их отношения?
2. @FereshtehAghaei Пожалуйста, предоставьте образец ввода-вывода. Решить вашу проблему будет легко.
3. @Linker Я добавил другие запросы к таблице и добавил изображение, каков результат
4. @zedfox Я добавил больше деталей, надеюсь, это будет более понятно, и изображение того, что получается
5. Ваша модель данных неясна. Похоже, что у одного свойства может быть несколько
PropInfo
записей, и это отбросит любые вычисления.
Ответ №1:
Вы можете попробовать что-то вроде этого:
select p.sstate, sum(distributionamount)
from distributionlog d
inner join propinfo pi
on d.hcode = pi.hcode
and extract(year from acquisitiondate) = 2019
and extract(year from distributiondate) = 2020
inner join property p on pi.hmy = p.hmy
group by p.sstate
В этом SQL мы объединяем 3 таблицы, как это делали и вы. Во время объединения мы указываем, что дата приобретения должна быть в 2019 году, а дата распространения — с 2020 года.
Ответ №2:
Поскольку вам нужна сумма (DL.distributionamount), DL.distributionamount не должен быть в предложении group by . Приведенный ниже запрос должен вернуть вам sstate wise sum (DL.distributionamount) для свойств, которые были приобретены в 2019 году и распространены в 2020 году.(связь между таблицами мне непонятна без выборочных данных. Итак, я предполагаю, что вы правильно выполнили объединение)
SELECT PY.sstate, SUM(DL.distributionamount) AS Total
FROM DistributionLog AS DL
JOIN PropInfo AS PI
ON PI.hmy = DL.hcode and PI.acquisitiondate BETWEEN '2019-1-1' AND '2019-12-31'
JOIN Property AS PY
ON PY.hmy = PI.hmy
WHERE distributionDate BETWEEN '2020-1-1' AND '2020-12-31'
GROUP BY PY.sstate
ORDER BY PY.sstate;
Комментарии:
1. @FereshtehAghaei ваша проблема решена?