select*vs select列是否可以提供不同的结果?

flvlnr44  于 2021-07-29  发布在  Java
关注(0)|答案(4)|浏览(312)

我使用的查询给出了苹果产品和三星产品的最大销售额之和。
我用union来显示这两个

Select max(amount) from abc 
Where product = 'apple'
Union 
Select max(amount) from abc 
Where product = 'samsung'

当我使用 select * vs中的所有列 select columns 需要。
在并集中是否存在 select * 所需的选择列会有所不同吗?

4jb9z9bj

4jb9z9bj1#

我怀疑条件聚合可能就是你所追求的:

SELECT
    MAX(CASE WHEN product = 'apple'   THEN amount END) AS max_apple_amount,
    MAX(CASE WHEN product = 'samsung' THEN amount END) AS max_samsung_amount
FROM abc;
66bbxpm5

66bbxpm52#

是的,可能有区别。那是因为 UNION 正在执行 DISTINCT ,这意味着如果在每列中选择了具有相同值的行,则只返回其中一个。
最近,如果你执行一些聚合 SUM 或者 COUNT 你会得到不同的结果。例如:

DECLARE @DataSource01 TABLE
(
    [ColA] INT
   ,[ColB] INT 
   ,[ColC] INT
);

DECLARE @DataSource02 TABLE
(
    [ColA] INT
   ,[ColB] INT 
   ,[ColC] INT
);

INSERT INTO @DataSource01 ([colA], [ColB], [ColC])
VALUES (1, 1, 1)
      ,(1, 1, 2)
      ,(1, 2, 3);

INSERT INTO @DataSource02 ([colA], [ColB], [ColC])
VALUES (1, 1, 4)
      ,(1, 1, 5)
      ,(1, 2, 6);

SELECT *
FROM @DataSource01
UNION 
SELECT *
FROM @DataSource02;

SELECT [colA], [ColB]
FROM @DataSource01
UNION 
SELECT [colA], [ColB]
FROM @DataSource02;


在您的情况下,最好使用:

SELECT MAX(IIF(product = 'apple', amount, NULL)
      ,MAX(IIF(product = 'samsung', amount, NULL)
FROM abc;
2ul0zpep

2ul0zpep3#

问题不在于询问,而在于解释。
因为您使用的是max(amount)并且只有两个产品(苹果和三星),所以它将给您两个记录中的任何一个,并且两个max(amount)中的一个记录是相同的。当您使用union时,它会丢弃重复项。
如果您想在不使用联合的情况下使用相同的查询,请参阅下面的

Select cola, colb, colc, max(amount) from abc where product in ('apple','samsung') group by cola, colb, colc;

请注意cola、colb、colc是表中列的名称。
类似地,如果希望按并集得到相同的结果,请使用列和分组方式,然后查看结果。
让我知道,如果你了解它,需要任何帮助与实际查询。

2q5ifsrm

2q5ifsrm4#

选择最大值(amount)的列时,必须按列分组。查询是:

select col1,col2...,Max(amount) from abc where product in ('apple','samsung') group by col1,col2...

如果您需要按产品列出最大金额行和计数的所有详细信息,我建议您进行以下查询:

select * from (SELECT *, ROW_NUMBER() OVER (PARTITION BY product ORDER BY amount DESC) AS rn FROM abc) tmp where product in ('apple','samsung') and rn=1

相关问题