【问题标题】:Need SQL query to group together but sort overall需要 SQL 查询组合在一起但整体排序
【发布时间】:2015-12-14 14:31:04
【问题描述】:

我有一个包含 Display_UPC、Brand、Item_Description 和其他字段的表。有几个商品具有相同的Display_UPC(所有商品属于同一个展示),有些展示有多个品牌。

我正在尝试打印一个页面,该页面显示所有显示内容(所有 Display_UPC 一起)以及各种项目描述,但按品牌排序(因此它以页面顶部的“A”品牌开头,然后是“B”品牌等...)。

问题是,如果我尝试:

SELECT DISTINCT *
FROM tbl_All_Displays
ORDER BY Brand, Display_UPC

一些展示(包含多个品牌的展示)缺少一些商品,因为它们是不同的品牌。我可以去掉 ORDER BY 中的“品牌”,它会一起返回完整的显示,但它们没有按品牌排序(显然)。

我猜这里可能需要一个 GROUP BY,但我找不到一个来工作。如果我尝试类似:

SELECT DISTINCT *
FROM tbl_All_Displays
GROUP BY Display_UPC
ORDER BY Brand, Display_UPC

我得到错误:

Column 'tbl_All_Displays.Item_Description' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

但我需要在页面上显示 Item_Description(和其他各种字段)。它们只是在排序/分组中并不重要。

样本数据:

样本预期结果:

因此,基本上,查询在排序中使用显示中的哪个品牌并不重要。如果一个展示包含一个品牌,那么它属于该品牌“组”是可以的,如果这有意义的话。这可能吗?

注意:我删除并重新发布了一个之前的问题,因为它的编辑很混乱。

编辑:这里是带有示例表数据的 sqlfiddle - http://sqlfiddle.com/#!6/5069c

【问题讨论】:

  • 准备sqlfiddle.com你会得到答案
  • 好的,我以前从未使用过 sqlfiddle.com。我会尝试在几分钟内完成设置。
  • 这里是 sql server sqlfiddle.com/#!6/dfcce/3的示例
  • 你为什么要为此创建新问题?正如您在另一个问题中两次建议的那样,您只需将订单更改为 Display_UPC, Brand
  • 你的结果没有多大意义。首先是一个以行为标题的空列查询 这是SQLReport 的要求吗?那么当有其他品牌的商品时,第一行怎么说Gerber?并且结果还包括空行?

标签: sql sql-server group-by sql-order-by


【解决方案1】:

您想先按每个Display_UPCmin(Brand) 排序吗?

那么你需要先按“Group Min”排序(fiddle:

SELECT * 
FROM Table1 
ORDER BY 
   min(Brand) over (partition by Display_UPC),
   Display_UPC, 
   Brand

【讨论】:

  • 这看起来正是我正在寻找的结果!你能告诉我“over (partition by Display_UPC)”是什么意思吗?
  • 就像你做一个group by ...类似于这个SELECT Display_UPC, MIN(BRAND) FROM Table1 GROUP BY Display_UPC
  • 它类似于 GROUP BY 的结果,但在不删除详细行的情况下,大多数 DBMS 支持那些“窗口聚合函数”。对于 SQL Server,请参阅 Simple Talk 上的一些文章,例如:simple-talk.com/sql/learn-sql-server/…
【解决方案2】:

dnoeth 做了一个很好的解决方案。但我想展示我正在使用的那个。

SQL FIDDLE DEMO

with 
    minBrand as (
       SELECT Display_UPC, MIN(BRAND) Brand
       from Table1
       GROUP BY Display_UPC
    )
select m.Brand MainBrand, t.* 
from minBrand  m
inner join Table1 t    
   on m.Display_UPC = t.Display_UPC
order by m.Brand, t.Display_UPC, t.Brand, t.Item_Description

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    相关资源
    最近更新 更多