SQL查询获取数据

时间:2009-11-29 12:27:05

标签: sql sql-server tsql sql-server-2000

在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)

谢谢!

6 个答案:

答案 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 - 可能没有用,但桌面设计并没有真正帮助你。如果您可以控制架构,则有助于将其分成多个表。