SQL GROUP BY не возвращает правильный результат для комбинации двух таблиц - PullRequest
0 голосов
/ 10 октября 2018

Я новичок в SQL и у меня проблемы.У меня есть две таблицы:
1. TopStock : Id |RuyeId| Code |ModelId|Quantity|ColorId
.............: 1 | 1019 |290105| 44 | 100 | 23
.............: 2 | 1019 |290105| 44 | 150 | 23
.............: 3 | 1019 |290105| 44 | 400 | 19
.............: 4 | 1019 |290105| 44 | 50 | 23
.............: 4 | 1018 |280102| 21 | 800 | 14

2. DownStock : Id|KafiId| Code |Quantity|ColorId
.............: 1 | 1005 | 2901 | 200 | 21


Это мой сценарий: TopStock можно объединить с DownStock, если DownStock '* Code равно первым 4 числамв TopStock х Code.Я хочу запрос, который показывает сумму суммы каждого TopStock s GROUP BY: ModelId,ColorId и сумму количества DownStocks, которые можно объединить с ним.

Это мой запрос:

SELECT DISTINCT SUM(top.Quantity) as Quantity, MAX(top.Code) as Code
MAX(top.ColorId) as ColorId, MAX(top.ModelId) as ModelId, MAX(top.RuyeId) as RuyeId,
SUM(down.Quantity) as DownQuantity
    FROM TopStock as top JOIN DownStock as down ON top.Code like '%'+down.Code+'%'
        WHERE top.Status = 0
            GROUP BY top.ModelId, top.ColorId, top.Code, down.Code  

Я хочу этот результат:
Quantity| Code |ColorId|ModelId|RuyeId|DownQuantity
. 300 |290105| 23 | 44 | 1019 | 200
. 400 |290105| 19 | 44 | 1019 | 200

Фактически DownQuantity должно быть суммой возможного DownStock количества для каждого GROUP BY ed TopStock элемента.Но запрос возвращает это:
Quantity| Code |ColorId|ModelId|RuyeId|DownQuantity
. 300 |290105| 23 | 44 | 1019 | 600 -> (3*200)
. 400 |290105| 19 | 44 | 1019 | 200

Проблема: 3*200, потому что у меня есть 3 TopStock строка с такими же ColorId и ModelId.Я просто хочу 200, а не 600. Кто-нибудь может это исправить?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Попробуйте, как показано ниже, используя row_number () оконную оконечность

with t1 as
 (
  select *, row_number() over(partition by ModelId,ColorId order by ColorId desc) rn
 from TopStock
 ) ,t2 as
(
 select t1.* from t1 where t1.rn<=2
) 
 select top.Code, top.ColorId, top.ModelId,  
       top.RuyeId, 
      SUM(top.Quantity) as Quantity,
      max(down.Quantity) as DownQuantity,
      from t2 top join DownStock down
      on top.Code like '%'+down.Code+'%'
      group by top.Code, top.ColorId, top.ModelId,  
       top.RuyeId
0 голосов
/ 10 октября 2018

Я удалил все случаи использования MAX, вы группируете по столбцам, нет причин создавать для них функцию агрегирования, поскольку будет только 1 значение.Кроме того, не используйте как отдельные, так и сгруппированные по.Я также присоединился к итоговой таблице, чтобы избежать дубликатов в объединении

SELECT SUM(top.Quantity) as Quantity,top.Code, top.ColorId, top.ModelId,  
       top.RuyeId, max(down.Quantity) as DownQuantity
FROM TopStock top 
JOIN (SELECT down.code, sum(down.quantity) as quantity FROM DownStock down
      GROUP BY down.code) down
 ON top.Code like '%'+down.Code+'%'
WHERE top.Status = 0
GROUP BY top.ModelId, top.ColorId, top.Code, down.Code  
...