请教联合查询 group by的写法

maddemon 2010-04-04 02:07:57
Company表
CompanyName CompanyId
Product表
ProductId,CompanyId,ProductName

现在是 一条 Company 对应多条 Product信息

需求是 查询结果是 Group By CompanId的 Prodcut列表信息, 就是查询的Product结果里Company没有重复
...全文
193 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
maddemon 2010-04-04
  • 打赏
  • 举报
回复
嗯 5楼是有问题-_- 分给的不太对。。
maddemon 2010-04-04
  • 打赏
  • 举报
回复
不好意思 分数少了点... 多谢各位了
htl258_Tony 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 fredrickhu 的回复:]
看来我5楼的没怎么错..呵呵
[/Quote]
select
*
from
Company a, Product b
where
a.CompanyId=b.CompanyId
and
b.CompanyId=(select max(CompanyId) from Product where ProductId=b.ProductId)

四个红色对换
老黎 2010-04-04
  • 打赏
  • 举报
回复

--借了Tony哥的测试数据

IF NOT OBJECT_ID('[Company]') IS NULL
DROP TABLE [Company]
GO
CREATE TABLE [Company]([CompanyName] NVARCHAR(10),[CompanyId] INT)
INSERT [Company]
SELECT 'a',1 UNION ALL
SELECT 'b',2
GO
--SELECT * FROM [Company]

--> 生成测试数据表:Product

IF NOT OBJECT_ID('[Product]') IS NULL
DROP TABLE [Product]
GO
CREATE TABLE [Product]([ProductId] NVARCHAR(10),[CompanyId] INT,[ProductName] NVARCHAR(10))
INSERT [Product]
SELECT 'p1',1,'pname1' UNION ALL
SELECT 'p2',1,'pname2' UNION ALL
SELECT 'p3',1,'pname3' UNION ALL
SELECT 'p1',2,'pname1' UNION ALL
SELECT 'p2',2,'pname2' UNION ALL
SELECT 'p3',2,'pname3'
GO
--SELECT * FROM [Product]

--取最小产品记录
select
*
from
product a
where
productid = (select min(productid) from product where companyid = a.companyid)

--结果
/*
ProductId CompanyId ProductName
---------- ----------- -----------
p1 1 pname1
p1 2 pname1

(2 行受影响)
*/

--取最小产品记录
select
*
from
product a
where
productid = (select max(productid) from product where companyid = a.companyid)

--结果
/*
ProductId CompanyId ProductName
---------- ----------- -----------
p3 2 pname3
p3 1 pname3

(2 行受影响)
*/

--取随机一条记录
select
*
from
product a
where
productid = (select top 1 productid from product where companyid = a.companyid order by newid())

--结果
/*
ProductId CompanyId ProductName
---------- ----------- -----------
p3 1 pname3
p2 2 pname2

(2 行受影响)
*/
maddemon 2010-04-04
  • 打赏
  • 举报
回复
多谢o(∩_∩)o
--小F-- 2010-04-04
  • 打赏
  • 举报
回复
看来我5楼的没怎么错..呵呵
htl258_Tony 2010-04-04
  • 打赏
  • 举报
回复
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-04 14:39:23
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:Company

IF NOT OBJECT_ID('[Company]') IS NULL
DROP TABLE [Company]
GO
CREATE TABLE [Company]([CompanyName] NVARCHAR(10),[CompanyId] INT)
INSERT [Company]
SELECT 'a',1 UNION ALL
SELECT 'b',2
GO
--SELECT * FROM [Company]

--> 生成测试数据表:Product

IF NOT OBJECT_ID('[Product]') IS NULL
DROP TABLE [Product]
GO
CREATE TABLE [Product]([ProductId] NVARCHAR(10),[CompanyId] INT,[ProductName] NVARCHAR(10))
INSERT [Product]
SELECT 'p1',1,'pname1' UNION ALL
SELECT 'p2',1,'pname2' UNION ALL
SELECT 'p3',1,'pname3' UNION ALL
SELECT 'p1',2,'pname1' UNION ALL
SELECT 'p2',2,'pname2' UNION ALL
SELECT 'p3',2,'pname3'
GO
--SELECT * FROM [Product]

-->SQL查询如下:
--法一:
SELECT A.[COMPANYNAME],B.[PRODUCTID],B.[PRODUCTNAME]
FROM [COMPANY] A
JOIN [PRODUCT] B
ON A.COMPANYID=B.COMPANYID
WHERE B.[PRODUCTID] =(
SELECT MIN([PRODUCTID])
FROM [PRODUCT]
WHERE COMPANYID=B.COMPANYID)
--法二:
SELECT A.[COMPANYNAME],B.[PRODUCTID],B.[PRODUCTNAME]
FROM [COMPANY] A
JOIN [PRODUCT] B
ON A.COMPANYID=B.COMPANYID
WHERE NOT EXISTS(
SELECT 1
FROM [PRODUCT]
WHERE COMPANYID=B.COMPANYID
AND [PRODUCTID]<B.[PRODUCTID])
/*
COMPANYNAME PRODUCTID PRODUCTNAME
----------- ---------- -----------
a p1 pname1
b p1 pname1

(2 行受影响)
*/
htl258_Tony 2010-04-04
  • 打赏
  • 举报
回复
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-04 14:39:23
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:Company

IF NOT OBJECT_ID('[Company]') IS NULL
DROP TABLE [Company]
GO
CREATE TABLE [Company]([CompanyName] NVARCHAR(10),[CompanyId] INT)
INSERT [Company]
SELECT 'a',1 UNION ALL
SELECT 'b',2
GO
--SELECT * FROM [Company]

--> 生成测试数据表:Product

IF NOT OBJECT_ID('[Product]') IS NULL
DROP TABLE [Product]
GO
CREATE TABLE [Product]([ProductId] NVARCHAR(10),[CompanyId] INT,[ProductName] NVARCHAR(10))
INSERT [Product]
SELECT 'p1',1,'pname1' UNION ALL
SELECT 'p2',1,'pname2' UNION ALL
SELECT 'p3',1,'pname3' UNION ALL
SELECT 'p1',2,'pname1' UNION ALL
SELECT 'p2',2,'pname2' UNION ALL
SELECT 'p3',2,'pname3'
GO
--SELECT * FROM [Product]

-->SQL查询如下:
SELECT A.[COMPANYNAME],B.[PRODUCTID],B.[PRODUCTNAME]
FROM [COMPANY] A
JOIN [PRODUCT] B
ON A.COMPANYID=B.COMPANYID
WHERE B.[PRODUCTID] =(
SELECT MIN([PRODUCTID])
FROM [PRODUCT]
WHERE COMPANYID=B.COMPANYID)
/*
COMPANYNAME PRODUCTID PRODUCTNAME
----------- ---------- -----------
a p1 pname1
b p1 pname1

(2 行受影响)
*/
maddemon 2010-04-04
  • 打赏
  • 举报
回复
这就是我想要的结果... 一个公司只取一条产品信息 就像阿里巴巴、淘宝那样的列表
htl258_Tony 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 maddemon 的回复:]
多谢各位回答 真不好意思,应该按照1楼所说的提问


----------------------------
ProductName ProductCount CompanyName
产品1 14 公司1
产品2 111 公司2
产品3 1234 公司3

ProductId和CompanyId都是Guid
[/Quote]
结果呢?
--小F-- 2010-04-04
  • 打赏
  • 举报
回复
不会只有一个表吧??建议给出所有的表结构和测试数据 以及所需要的结果
maddemon 2010-04-04
  • 打赏
  • 举报
回复
多谢各位回答 真不好意思,应该按照1楼所说的提问


----------------------------
ProductName ProductCount CompanyName
产品1 14 公司1
产品2 111 公司2
产品3 1234 公司3

ProductId和CompanyId都是Guid
喜-喜 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 htl258 的回复:]
SQL code
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-04 14:39:23
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.25……
[/Quote]

哇哦...这样都行!学习了...
htl258_Tony 2010-04-04
  • 打赏
  • 举报
回复
--------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-04-04 14:39:23
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:Company

IF NOT OBJECT_ID('[Company]') IS NULL
DROP TABLE [Company]
GO
CREATE TABLE [Company]([CompanyName] NVARCHAR(10),[CompanyId] INT)
INSERT [Company]
SELECT 'a',1 UNION ALL
SELECT 'b',2
GO
--SELECT * FROM [Company]

--> 生成测试数据表:Product

IF NOT OBJECT_ID('[Product]') IS NULL
DROP TABLE [Product]
GO
CREATE TABLE [Product]([ProductId] NVARCHAR(10),[CompanyId] INT,[ProductName] NVARCHAR(10))
INSERT [Product]
SELECT 'p1',1,'pname1' UNION ALL
SELECT 'p2',1,'pname2' UNION ALL
SELECT 'p3',1,'pname3' UNION ALL
SELECT 'p1',2,'pname1' UNION ALL
SELECT 'p2',2,'pname2' UNION ALL
SELECT 'p3',2,'pname3'
GO
--SELECT * FROM [Product]

-->SQL查询如下:
select case when [ProductId]=(select MIN([ProductId]) from [Product] where [CompanyId]=t.[CompanyId])
then (select [CompanyName] from [Company] where [CompanyId]=t.[CompanyId])
else ''
end as [CompanyName],
[ProductId],[ProductName]
from [Product] t
/*
CompanyName ProductId ProductName
----------- ---------- -----------
a p1 pname1
p2 pname2
p3 pname3
b p1 pname1
p2 pname2
p3 pname3

(6 行受影响)
*/
楼主该不会是这个意思吧
喜-喜 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 maddemon 的回复:]
Company表
CompanyName CompanyId
Product表
ProductId,CompanyId,ProductName

现在是 一条 Company 对应多条 Product信息

需求是 查询结果是 Group By CompanId的 Prodcut列表信息, 就是查询的Product结果里Company没有重复
[/Quote]

"查询的Product结果里Company没有重复",是只要其中的一行数据吗
--小F-- 2010-04-04
  • 打赏
  • 举报
回复
select
*
from
Company a, Product b
where
a.CompanyId=b.CompanyId
and
b.CompanyId=(select max(CompanyId) from Product where ProductId=b.ProductId)
心中的彩虹 2010-04-04
  • 打赏
  • 举报
回复
select CompanyId,count(*) rn,max(ProductId) ProductId,max(ProductName) as ProductName
from Product
group by CompanyId
having count(*)=1


maddemon 2010-04-04
  • 打赏
  • 举报
回复
select * from Product where ProductId in (
select (select top 1 ProductId from Product where CompanyId = Company.CompanyId)as Product from Company)
这样写 我想可能太慢了
palosky 2010-04-04
  • 打赏
  • 举报
回复
楼上说的有道理
ACMAIN_CHM 2010-04-04
  • 打赏
  • 举报
回复
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧