首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有分组集的SQL查询,以获得有子句的小计(非加性度量)

带有分组集的SQL查询,以获得有子句的小计(非加性度量)
EN

Database Administration用户
提问于 2018-11-18 01:18:21
回答 2查看 123关注 0票数 -1

假设我有一个(虚构的)表顺序,其列如下:

OrderId: string

供应商:字符串

频道:字符串

我想要一个查询,统计每个渠道的不同供应商的数量,以及总体上的数量。查询应该只考虑最少N个不同供应商的渠道

代码语言:javascript
运行
复制
create table #Order
(OrderId varchar(10),
Supplier varchar(10),
Channel varchar(10)
)

INSERT INTO #Order(OrderID,Supplier,Channel)
VALUES
 ('1','Supp 1','Paper')
,('2','Supp 2','Paper')
,('3','Supp 3','Paper')

,('6','Supp 4','Inter')
,('7','Supp 5','Inter')

,('13','Supp 1','aa')
,('14','Supp 2','aa')
,('15','Supp 3','aa')
,('55','Supp 4','aa')

SELECT ISNULL(Channel,'Total Distinct Supp')  as Channel, COUNT(DISTINCT Supplier) AS [SupplierCount]
FROM   #Order
GROUP  BY GROUPING SETS ((Channel), ())
HAVING COUNT(DISTINCT Supplier) > 2
ORDER  BY ISNULL(Channel,'Total Distinct Supp');

这个查询的问题是,总计将包括来自少于2个供应商的渠道的供应商。

以上查询的结果:

代码语言:javascript
运行
复制
Channel SupplierCount
aa  4
Paper   3
Total Dist  5

预期结果:

代码语言:javascript
运行
复制
Channel SupplierCount
aa  4
Paper   3
Total Dist  4

我们如何修改上述查询以满足需求?

我在用sql azure..。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-11-19 06:08:53

只是另一种方式,具有相同的输出:

代码语言:javascript
运行
复制
create table #Order
(OrderId varchar(10),
Supplier varchar(10),
Channel varchar(10)
)

INSERT INTO #Order(OrderID,Supplier,Channel)
VALUES('1','Supp1','Paper')
,('2','Supp1','Paper')
,('3','Supp 3','Paper')
,('4','Supp 4','Paper')
,('5','Supp 5','Paper')

,('6','Supp 8','Inter')
,('7','Supp 6','Inter')

,('13','Supp 30','aa')
,('14','Supp 44','aa')
,('15','Supp 7','aa')
,('55','Supp 5','aa')


SELECT ISNULL(O.Channel,'Total Distinct Supp')  as Channel
      ,COUNT(Distinct Supplier) as SupplierCount
FROM #Order AS O
  INNER JOIN
  (
  SELECT Channel
       , COUNT(DISTINCT Supplier) AS [SupplierCount]
  FROM #Order as O
  GROUP BY Channel
  HAVING COUNT(Distinct Supplier)>2
 )C 
   ON o.Channel = C.Channel
GROUP BY GROUPING SETS ((O.Channel), ())
ORDER  BY ISNULL(O.Channel,'Total Distinct Supp');

产出:

代码语言:javascript
运行
复制
Channel SupplierCount
aa  4
Paper   4
Total Dist  7

[医]小提琴

票数 1
EN

Database Administration用户

发布于 2018-11-18 03:22:47

您没有提供DDL,所以下面的代码没有测试:也许这就是您想要的?

代码语言:javascript
运行
复制
WITH GroupedSuppliers
    AS
    (
    SELECT Channel, COUNT(DISTINCT Supplier) AS [SupplierCount]
    FROM   [Order]
    GROUP  BY Channel
    HAVING COUNT(DISTINCT Supplier) > 10
    )
SELECT *
FROM   GroupedSuppliers
UNION ALL
SELECT  NULL, 
        COUNT(DISTINCT Supplier)
FROM [Order] 
WHERE Channel IN (SELECT Channel FROM GroupedSuppliers)
ORDER  BY Channel;
票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/222799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档