Выберите множественное значение из таблицы, но сгруппируйте по одному значению - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь выбрать несколько значений из двух таблиц, но я хочу сгруппировать по одному значению. Я попытался использовать max (значение) в select, но max возвращает самое большое, а не точное.

Вот мои таблицы enter image description here

Результат мне нужно что-то вроде этого

Result : HeadQuarterId - A, PropertyName - Name1, Amount - 102
         HeadQuarterId - B, PropertyName - Name5, Amount - 30

Вот мой запрос

SELECT  Headquarterid,Max(PropertyName),sum(Amount)  
FROM Table1 A LEFT OUTER JOIN Table2 B
ON A.Propetyid = B.PropertyId  
GROUP BY Headquarterid

Здесь я использовал левое внешнее соединение, так что я получу все данные из левой таблицы, даже если это не так доступно в правой таблице.

Также я не могу использовать A.HeadquarterID = A.PropertyId в условии условия, так как у меня есть другая зависимость в этой таблице. Пожалуйста, предложите другой способ достижения этого результата.

Ответы [ 4 ]

1 голос
/ 11 февраля 2020

Мне кажется, я понимаю. Вы хотите, чтобы штаб-квартира имела максимальное значение, равное A. Если это так:

select t1.*, sum(t2.amount) over () as total
from t1 left join
     t2
     on t2.PropertyId = t1.PropertyId
order by t2.amount desc
fetch first 1 row only;

Примечание. Не все базы данных поддерживают fetch first. Например, можно записать limit или использовать select top (1).

1 голос
/ 11 февраля 2020

Я бы порекомендовал получить имя штаб-квартиры для каждого идентификатора в cte / подзапросе, затем снова присоединить его к T1 и оставить левое соединение T1 к T2 во втором cte / подзапросе. Таким образом, вы можете рассчитать свои суммы на основе одной группы:

WITH cte AS(
SELECT ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY CASE WHEN t1.ID = t1.PROPERTYID THEN 0 ELSE 1 END) rn, t1.ID, t1.Name
  FROM t1
),
cte2 AS(
SELECT c.name cName, t1.*, t2.Value
  FROM t1
  INNER JOIN cte c ON c.ID = t1.ID AND c.rn = 1
  LEFT JOIN t2 ON t1.Propertyid = t2.propertyid
)
SELECT c2.id, c2.cname, sum(c2.value) value
  FROM cte2 c2
  GROUP BY c2.id, c2.cname

Подробнее см. SQLFiddle: http://sqlfiddle.com/#! 18 / 8bf66 / 13/2

Конечно, вы можете создать первый cte без row_number только с помощью WHERE ID = PROPERTYID - вопрос вкуса, я бы сказал ...

1 голос
/ 11 февраля 2020

Согласно вашим образцам данных вы хотите окно функция:

select distinct t1.HeadQuarterId, 
       max(t1.PropertyName) over (partition by t1.HeadQuarterId) as PropertyName,
       sum(t2.amount) over (partition by t1.HeadQuarterId) as amount
from t1 left join
     t2
     on t2.PropertyId = t1.PropertyId;
0 голосов
/ 12 февраля 2020

Это дало ожидаемый результат.

SELECT HQTRS1 AS headId,Max(LLORD1) AS headName, sum(Amount) AS amount  
FROM 
    (SELECT DISTINCT HeadQuarterId AS HQTRS1, PropertyName AS LLORD1 FROM Table_1 WHERE HeadQuarterId = PropertyId) AS temp
        INNER JOIN Table_1 AS A ON A.HeadQuarterId  = temp.HQTRS1
        LEFT OUTER JOIN Table_2 B
        ON B.PropertyId = A.PropertyId
        GROUP BY HQTRS1
...