2016-02-12 4 views
1

У меня есть следующие таблицы в базе данных. У нас есть продукт, который имеет несколько продуктов для серии, и у нас есть ProductVariation, который имеет несколько вариаций продукта на продукт.T-SQL Выберите MAX из подзапроса

Мы желаем выполнить набор совокупных запросов в таблице ProductVariation для набора продуктов на основе идентификатора серии. Для SeriesID из 276 идентификатор продукта 400-415 соответствует идентификатору SeriesID. Затем мы хотим найти минимальное и максимальное количество различных полей в таблице ProductVariation, которым присвоено 400-415 ProductID.

T-SQL заявление я написал следующий: -

SELECT(
    SELECT MAX([X]) FROM [ProductVariation] AS B WHERE B.ProductID = A.ProductID  
) 
FROM [Product] AS A 
WHERE SeriesID = 12 AND IsDeleted = 0 and IsEnabled = 1 

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

Может ли кто-нибудь предложить, как получить максимум от максимума?

Cheers, Mike.

ответ

1

Итак, моя проблема в том, что выше все было в порядке, но оказалось, что я искал группу по SeriesID, чтобы вернуть MIN и MAX заданных полей на SeriesID. Большое спасибо за все заявления SQL, вы, ребята, помогли устранить проблему, которую я имел много раз раньше! :)

В SQL Server: -

@ пост Оливера было то, что сделал это, чтобы вызвать то, что мне было нужно. Затем я добавил группу для того, что мне нужно было сделать, для GROUP BY SeriesID.

В LINQ: -

(from x in productBlocks 
    join y in products on x.ProductBlockID equals y.ProductBlockID 
    where x.SeriesID == id && x.IsEnabled && !x.IsDeleted 
    group y by x.SeriesID into g 
    select new SeriesCharacteristicsViewModel 
    { 
     MinWheelDiameter = g.Min(s => s.WheelDiameter), 
     MaxWheelDiameter = g.Max(s => s.WheelDiameter), 
     ShoreHardness = g.Select(s => s.ShoreHardness).FirstOrDefault(), 
     MinimumCarryingCapacityAt4kmh = g.Min(s => s.StaticCapacity), 
     MaximumCarryingCapacityAt4kmh = g.Max(s=>s.StaticCapacity), 
     MinimumRollingResistance = g.Min(s=>s.RollingResistance), 
     MaximumRollingResistance = g.Max(s=>s.RollingResistance), 
     MinimumTemperature = g.Min(s=>s.TempFrom), 
     MaximumTemperature = g.Max(s=>s.TempTo) 
    } 
) 
2

Если я хорошо вас понял, вы просите за это:

SELECT MAX(
    SELECT MAX([WheelDiameter]) FROM [AUT].[dbo].[Product] AS B WHERE B.ProductBlockID = A.ProductBlockID  
) 
FROM [AUT].[dbo].[ProductBlock] AS A 
WHERE SeriesID = 12 AND IsDeleted = 0 and IsEnabled = 1 
+0

Это то, что я пытался тоже, но я получаю 'неправильный синтаксис около ключевого слова SELECT' на линии 2. –

+0

«Невозможно выполнить агрегатную функцию на выражение, содержащее совокупность или подзапрос ". –

+0

WITH NewSelect AS (SELECT MAX ([WheelDiameter]) FROM [AUT]. [Dbo]. [Product] AS B WHERE B.ProductBlockID = A.ProductBlockID ) AS max1 FROM [AUT]. [Dbo] . [ProductBlock] AS A WHERE SeriesID = 12 И IsDeleted = 0 и IsEnabled = 1) SELECT MAX (max1) –

0
SELECT MAX(A.MAXVALUE) as MAXVALUE 
FROM 
(
SELECT MAX([WheelDiameter]) MAXVALUE 
FROM [AUT].[dbo].[Product] AS B 
INNER JOIN FROM [AUT].[dbo].[ProductBlock] AS A 
ON (B.ProductBlockID = A.ProductBlockID) 
WHERE SeriesID = 12 
AND IsDeleted = 0 
AND IsEnabled = 1  
)A 
0

Попробуйте это:

SELECT a.SeriesID, min(c.min), max(c.max) 
FROM [Product] AS A outer apply 
     (SELECT MIN(X) min, MAX([X]) max 
     FROM [ProductVariation] AS B 
     WHERE B.ProductID = A.ProductID) as c 
WHERE a.SeriesID in (12,13,14) AND a.IsDeleted = 0 and a.IsEnabled = 1 
GROUP BY a.SeriesID 
0
SELECT MAX(A.Maximum) as MAXVALUE 
FROM 
(
    SELECT MAX([WheelDiameter]) Maximum 
    FROM [AUT].[dbo].[Product] AS Product WHERE Product.ProductBlockID = ProductBlock.ProductBlockID 
    INNER JOIN [AUT].[dbo].[ProductBlock] AS ProductBlock ON Product.ProductBlockID = ProductBlock.ProductBlockID 
    WHERE SeriesID = 12 AND IsDeleted = 0 and IsEnabled = 1  
) A 
3

Так по существу, вы просто хотите один максимум для целая серия? Я думаю, что в других решениях слишком много MAX. Просто используйте соединение:

SELECT MAX(PV.X), MAX(PV.Y) 
FROM [Product] AS P 
JOIN [ProductVariation] AS PV ON P.ProductID = PV.ProductID 
WHERE P.SeriesID = 12 AND P.IsDeleted = 0 and P.IsEnabled = 1 

Таким образом, вы также можете запросить несколько максимумов одновременно.

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