SQL-запрос для получения данных - PullRequest
0 голосов
/ 29 ноября 2009

В SQL Server 2000:

привет, у меня есть таблица со следующей структурой:

sku      brand     product_name       inventory_count
------   ------    -------------      ---------------
c001     honda     honda car 1         3
t002     honda     honda truck 1       6
c003     ford      ford car 1          7
t004     ford      ford truck 1        8
b005     honda     honda bike 5        9
b006     ford      ford bike 6        18

Я использую следующий запрос SQL

select distinct left(sku,1) from products

это вернет следующее:

c
t
b

, а затем ...

c = car
t = truck
b = bike

это прекрасно работает,

Теперь я хочу получить только один пример продукта для каждой категории с наибольшим значением INVENTORY_COUNT

так что он возвращает данные как:

c, "ford car 1"
t, "ford truck 1"
b, "ford bike 6"

какой SQL-запрос я бы запустил, чтобы получить эти данные ??

я хочу получить элемент с наибольшим значением INVENTORY_COUNT для каждой категории .. слева (sku, 1)

спасибо !!

Ответы [ 6 ]

1 голос
/ 29 ноября 2009

я использую следующий SQL-запрос, который работает,

ВЫБЕРИТЕ DISTINCT слева (поле 1,1) как cat, MAX (sku) как продукты, из которых инвентаризация> 0 GROUP BY left (sku, 1)

Мне просто нужно добавить туда .. порядок по инвентаризации

1 голос
/ 29 ноября 2009

Вы можете присоединиться к самой таблице, чтобы отфильтровать строки с меньшим количеством инвентаря:

select       left(a.sku,1), max(a.product_name), max(a.inventory_count)
from         YourTable a
left join    YourTable more_inv
on           left(a.sku,1) = left(more_inv.sku,1)
and          a.inventory_count < more_inv.inventory_count
where        more_inv.sku is null
group by     left(a.sku,1)

Условие WHERE на more_inv.sku is null отфильтровывает строки, которые не имеют наибольшего запаса для своей однобуквенной категории.

Как только мы перейдем к строкам с максимальным запасом, вы можете использовать max(), чтобы получить inventory_count (оно будет одинаковым для всех рядов) и еще один max(), чтобы получить один из продуктов с самый высокий inventory_count. Вы можете использовать min() тоже.

0 голосов
/ 30 ноября 2009

В общем, может ли быть не более одного предмета с максимальным количеством (инвентаризационным счетом)?

Чтобы получить максимальный запас для категрии, используйте подзапрос (синтаксис зависит от вашей базы данных):

SELECT LEFT(sku,1) as category, MAX(inventory_count) as c
FROM Table1
GROUP BY LEFT(sku,1)
SORT BY LEFT(sku,1)

Это даст вам таблицу max_inventory по категориям, таким образом:

b,18
c,7
t,8

Итак, теперь вы знаете максимум по категории. Чтобы получить соответствующие продукты, используйте этот результат как подзапрос и найти все продукты в данной категории, которые соответствуют максимальному (инвентаризации):

SELECT t1.*
FROM Table1 AS t1,
(SELECT LEFT(sku,1) AS category, MAX(inventory_count) AS c
 FROM Table1
 GROUP BY LEFT(sku,1)
) AS t2
WHERE LEFT(t1.sku,1) = t2.category AND t2.c = t1.inventory_count

Извините, приведенный выше код может / не может работать в вашей базе данных, но надеюсь, что вы поняли идею.

Bill

PS - возможно, это не полезно, но дизайн стола здесь не особо помогает. Если у вас есть контроль над схемой, поможет разделить это на несколько таблиц.

0 голосов
/ 29 ноября 2009

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

declare @t table (sku varchar(50),brand varchar(50),product_name varchar(50),inventory_count int)
insert into @t 

  select 'c001','honda','honda car 1',3 union all
  select 't002','honda','honda truck 1',6 union all
  select 'c004','ford','ford car 1',7 union all
  select 't004','ford','ford truck 1',8 union all
  select 'b005','honda','honda bike 5',9 union all
  select 'b006','ford','ford bike 6',18

Запрос:

select 

x.s + space(2) + ',' + space(2) + '"' + t.product_name  + '"' as [Output] 

from @t t
inner join
(
    SELECT left(sku,1) as s,MAX(inventory_count) ic from @t
    group by left(sku,1)
) x
on x.ic = t.inventory_count
--order by t.inventory_count desc

выход

c  ,  "ford car 1"
t  ,  "ford truck 1"
b  ,  "ford bike 6"
0 голосов
/ 29 ноября 2009

Используя SQL Server 2005, вы можете попробовать это

DECLARe @Table TABLE(
    sku VARCHAR(50), 
    brand VARCHAR(50), 
    product_name VARCHAR(50), 
    inventory_count INT
)

INSERT INTO @Table SELECT 'c001', 'honda', 'honda car 1', 3

INSERT INTO @Table SELECT 't002', 'honda', 'honda truck 1', 6

INSERT INTO @Table SELECT 'c003', 'ford', 'ford car 1', 7

INSERT INTO @Table SELECT 't004', 'ford', 'ford truck 1', 8

INSERT INTO @Table SELECT 'b005', 'honda', 'honda bike 5', 9

INSERT INTO @Table SELECT 'b006', 'ford', 'ford bike 6', 18


SELECT  LEFT(sku,1),
        product_name
FROM    (
            SELECT  *,
                    ROW_NUMBER() OVER( PARTITION BY LEFT(sku,1) ORDER BY inventory_count DESC) ORDERCOUNT
            FROm    @Table
        ) SUB
WHERE   ORDERCOUNT = 1

ОК. Тогда вы можете попробовать

SELECT  LEFT(sku,1),
            *
    FROm    @Table t INNER JOIN
            (
                SELECT LEFT(sku,1) c,
                        MAX(inventory_count) MaxNum
                FROM    @Table
                GROUP BY LEFT(sku,1)
            ) sub ON  LEFT(t.sku,1) = sub.c and t.inventory_count = sub.MaxNum
0 голосов
/ 29 ноября 2009

Для MySQL:

SELECT LEFT(sku,1), product_name FROM Table1 GROUP BY LEFT(sku,1)

Для MS SQL 2005 (возможно, также работает в 2000?):

SELECT LEFT(sku,1), MAX(product_name) FROM Table1 GROUP BY LEFT(sku,1)
...