在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项最多.. left(sku,1)
谢谢!
答案 0 :(得分:1)
您可以将表连接到自身以过滤掉小于最大库存的行:
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)
more_inv.sku is null
上的WHERE条件会过滤掉一个字母类别中没有最高广告资源的行。
一旦我们找到具有最大广告资源的行,您就可以使用max()
获取inventory_count
(所有行都相同)和另一个max()
获得具有最高inventory_count
的产品之一。您也可以使用min()
。
答案 1 :(得分:1)
即时使用以下有效的sql查询,
SELECT DISTINCT left(field1,1)为cat,MAX(sku)为topproduct FROM products,inventory_count&gt; 0 GROUP BY left(sku,1)
我只需要通过inventory_count
添加..order答案 2 :(得分:0)
对于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)
答案 3 :(得分:0)
使用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
答案 4 :(得分:0)
试试这个
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"
答案 5 :(得分:0)
一般情况下,max(inventory_count)可能没有多个项目吗?
要获得每个cateogry的最大库存,请使用子查询(语法取决于您的数据库):
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
所以现在你知道每个类别的最大值。要获得匹配的产品,请将此结果用作 子查询并找到给定的cateogry中与给定max(inventory_count)匹配的所有产品:
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
很抱歉,上面的代码可能/可能不适用于您的数据库,但希望您明白这一点。
比尔
PS - 可能没有用,但桌面设计并没有真正帮助你。如果您可以控制架构,则有助于将其分成多个表。