-1

如果我有这样的表:

FRUIT
------------------------
GRANNY SMITH
BANNANA
CHERRY
RED DELICIOUS
DURIAN
FIG
GRAPE
LIME
ORANGE
BRAEBURN
TANGERINE
GRANNY SMITH
ORANGE
ORANGE
GRANNY SMITH
LIME
FIG
FIG
GRANNY SMITH
BRAEBURN

我想使用 SQL 生成以下输出,我该怎么做?我想总结苹果下不同苹果品种的数量,柑橘类型也是如此,但其他一切都只是一个计数。

FRUIT       COUNT
----------- ------
APPLE       7
BANNANA     1
CHERRY      1
CITRUS      6
DURIAN      1
FIG         3
GRAPE       1

我尝试使用带有条件的嵌套聚合,但 SQL 不支持嵌套聚合,所以我正在寻找其他一些想法。

4

5 回答 5

1

您可以 GROUP BY 您现有的 CASE 语句,但您必须使用派生表(或在 GROUP BY 中重复那个巨大的 CASE):

select FRUIT, COUNT(*)
from 
 (
   select CASE 
             WHEN FRUIT IN ('GRANNY SMITH', 'RED DELICIOUS', ...) THEN 'APPLE'
             WHEN FRUIT IN ('ORANGE', 'TANGERINE', ...) THEN 'CITRUS'
             ELSE FRUIT
          END AS FRUIT
   from tab
 ) dt
group by FRUIT
order by FRUIT
于 2015-04-02T21:58:27.737 回答
0

您应该在表中添加一个 FruitCategory 列。

Fruit          FruitCategory
----------------------------
GRANNY SMITH   APPLE
BANNANA        BANNANA
BRAEBURN       APPLE
...

然后你可以按 FruitCategory 分组

SELECT FruitCategory, COUNT(*) AS [Count]
FROM tblFruit
GROUP BY FruitCategory
ORDER BY FruitCategory

但最好有一个单独的水果类别表。

FruitCategoryID FruitCategory
-----------------------------
1               Apple
2               Banana
...

然后将您的水果表更改为

Fruit          FruitCategoryID
------------------------------
GRANNY SMITH   1
BANNANA        2
BRAEBURN       1
...

这允许您将类别表用作组合框等的查找,并使其更加健壮,因为将类别名称直接写入水果表很容易出错。

SELECT
    c.FruitCategory, COUNT(*) AS [Count]
FROM
    tblFruit f
    INNER JOIN tblFruitCategory c
        ON f.FruitCategoryID = c.FruitCategoryID
GROUP BY
    f.FruitCategoryID
ORDER BY
    c.FruitCategory
于 2015-04-02T21:25:34.160 回答
0

假设您在同一张表中添加了 Apples as type=1, Citrus fruits astype=2和其他 as (列 as ),那么就这样做 -type=3Type

select CASE Type WHEN 1 THEN APPLE ELSE CITRUS, count(*) as COUNT
from table
where Type in (1,2)
group by Type
union all
select FRUIT, count(*) as COUNT
from table
where Type = 3
group by FRUIT
于 2015-04-02T21:31:27.250 回答
0

这是我将如何做到的。您也可以将 FRUIT_LOOKUP 设为表,但您不需要这样做,您可以在查询中虚拟地创建它,如下所示:

WITH FRUIT_LOOKUP AS
(
   SELECT 'GRANNY SMITH' AS FRUIT, 'APPLE' AS FTYPE
   UNION ALL
   SELECT 'BANNANA' AS FRUIT, 'BANNANA' AS FTYPE
   UNION ALL
   SELECT 'CHERRY' AS FRUIT, 'CHERRY' AS FTYPE
   UNION ALL
   SELECT 'RED DELICIOUS' AS FRUIT, 'APPLE' AS FTYPE
   UNION ALL
   SELECT 'DURIAN' AS FRUIT, 'DURIAN' AS FTYPE
   UNION ALL
   SELECT 'FIG' AS FRUIT, 'FIG' AS FTYPE
   UNION ALL
   SELECT 'GRAPE' AS FRUIT, 'GRAPE' AS FTYPE
   UNION ALL
   SELECT 'LIME' AS FRUIT, 'CITRUS' AS FTYPE
   UNION ALL
   SELECT 'TANGERINE' AS FRUIT, 'CITRUS' AS FTYPE
   UNION ALL
   SELECT 'BRAEBURN' AS FRUIT, 'APPLE' AS FTYPE
   UNION ALL
   SELECT 'ORANGE' AS FRUIT, 'CITRUS' AS FTYPE
)
SELECT FL.FTYPE AS FRUIT, COUNT(*) AS COUNT
FROM FRUITTABLE F
JOIN FRUIT_LOOKUP FL ON F.FRUIT = FL.FRUIT
GROUP BY FL.FTYPE
于 2015-04-02T21:36:33.660 回答
0

从 DBTable Group By FRUIT 中选择 FRUIT,Count(FRUIT)

如果你想订购:)

Select FRUIT,Count(FRUIT) from DBTable Group By FRUIT Order by Count(FRUIT)

于 2015-04-02T21:40:24.383 回答