【问题标题】:SQL SELECT multiple count in one querySQL SELECT 一次查询中的多个计数
【发布时间】:2021-07-17 04:08:55
【问题描述】:

我有这两张表:

我想得到这个结果:

我怎样才能通过只使用一个查询来实现这一点?

我尝试过加入、计数和分组,但我做错了。

我已经尝试过了,但我无法让它正常工作。

SELECT
    coupon.*,
    couponUsers.returned AS COUPON_TOTAL_USERS,
    couponUses.returned AS COUPON_TOTAL_USES
FROM
    coupon,
    (SELECT
         coupon.COUPON_CODE,
         COUNT(redeemed.REDEEMED_USER) AS returned
     FROM
         coupon
     JOIN 
         redeemed ON coupon.COUPON_CODE = redeemed.REDEEMED_CODE
     GROUP BY
         redeemed.REDEEMED_USER) couponUsers,
    (SELECT
         coupon.COUPON_CODE,
         COUNT(redeemed.REDEEMED_CODE) AS returned
     FROM
         coupon
     JOIN 
         redeemed ON coupon.COUPON_CODE = redeemed.REDEEMED_CODE
     GROUP BY
         redeemed.REDEEMED_CODE) couponUses
WHERE 
    coupon.COUPON_CODE = couponUsers.COUPON_CODE 
    AND coupon.COUPON_CODE = couponUses.COUPON_CODE
GROUP BY
    coupon.COUPON_CODE
ORDER BY
    coupon.COUPON_ID ASC

如果你想在 SQL fiddle 或类似的东西中自己尝试,这是构建模式。

CREATE TABLE IF NOT EXISTS `coupon` 
(
    `COUPON_ID` int(11) NOT NULL,
    `COUPON_CODE` varchar(32) NOT NULL
) DEFAULT CHARSET=utf8;

INSERT INTO `coupon` (`COUPON_ID`, `COUPON_CODE`) VALUES 
(1, "AAAAA"),
(2, "BBBBB"),
(3, "CCCCC"),
(4, "DDDDD"),
(5, "EEEEE");

CREATE TABLE IF NOT EXISTS `redeemed` (
  `REDEEMED_ID` int(11) NOT NULL,
  `REDEEMED_USER` varchar(32) NOT NULL,
  `REDEEMED_CODE` varchar(32) NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `redeemed` (`REDEEMED_ID`, `REDEEMED_USER`, `REDEEMED_CODE`) VALUES 
(1, "TOM", "AAAAA"),
(2, "PAULA", "BBBBB"),
(3, "TOBI", "CCCCC"),
(4, "JANA", "DDDDD"),
(5, "INGO", "EEEEE"),
(6, "TOM", "AAAAA"),
(7, "PETER", "EEEEE"),
(8, "JIM", "DDDDD"),
(9, "SARA", "AAAAA"),
(10, "TOBI", "CCCCC"),
(11, "PAULA", "AAAAA"),
(12, "TOM", "AAAAA"),
(13, "PAULA", "BBBBB"),
(14, "JIM", "DDDDD"),
(15, "JANA", "DDDDD");

我已经尝试了几个小时.. 是时候寻求帮助了^^

【问题讨论】:

  • 你好,尝试发布一些编程代码,它会增加你收到答案的机会。
  • 您可以使用连接查询来连接COUPON_CODEREDEEMED_CODE 并对其他列进行计数。如果您需要更多有用的答案,请添加文本格式的表格,也请编写您尝试过的代码
  • @PraveenPremaratne 我添加了表格(构建模式)和我浪费的代码^^

标签: sql join group-by count


【解决方案1】:

您应该能够在单个表查询中生成所需的计数:

select 
       redeemed_code
     , count(*) as tot_uses
     , count(distinct redeemed_user) as tot_users
from redeemed
group by redeemed_code

您可以将此连接到优惠券表以进行最终输出,例如,使用左连接,您将获得coupon 中列出的所有优惠券,即使尚未兑换。

 select
      c.coupon_id
    , c.coupon_code
    , coalesce(d.tot_uses,0) as tot_uses
    , coalesce(d.tot_users,0) as tot_users
from coupon as c
left join (
         select 
                 redeemed_code
              ,  count(*) as tot_uses
              , count(distinct redeemed_user) as tot_users
         from redeemed
         group by redeemed_code
         ) as d on c.coupon_code = d.redeemed_code
coupon_id coupon_code tot_uses tot_users
1 AAAAA 5 3
2 BBBBB 2 1
3 CCCCC 2 1
4 DDDDD 4 2
5 EEEEE 2 2

db小提琴here

【讨论】:

  • 我尝试了你的代码,但这不起作用。
  • 引用了错误的列,抱歉尝试使用电话接听
  • 非常感谢,这很有帮助,而且工作完美。
【解决方案2】:

这是针对 PostgreSQL 的,但是这个查询应该适合你。您可以在redeemed 表上执行GROUP BY 并将其与coupon 连接以获得COUPON_ID。 \

psql=# WITH redeemed_query AS (
        SELECT 
                "REDEEMED_CODE", 
                COUNT(*) AS "TOTAL_USES", 
                COUNT(DISTINCT("REDEEMED_USER")) AS "TOTAL_USERS" 
        from redeemed GROUP BY "REDEEMED_CODE"
) 
SELECT * FROM redeemed_query 
INNER JOIN 
coupon ON redeemed_query."REDEEMED_CODE" = coupon."COUPON_CODE";


 REDEEMED_CODE | TOTAL_USES | TOTAL_USERS | COUPON_ID | COUPON_CODE 
---------------+------------+-------------+-----------+-------------
 AAAAA         |          5 |           3 |         1 | AAAAA
 BBBBB         |          2 |           1 |         2 | BBBBB
 CCCCC         |          2 |           1 |         3 | CCCCC
 DDDDD         |          4 |           2 |         4 | DDDDD
 EEEEE         |          2 |           2 |         5 | EEEEE
(5 rows)

【讨论】:

  • 谢谢你,我不使用 postgreSQL,但也许这对将来的其他人也有帮助:)
  • 查询应该仍然对你有用,引号应该只替换为勾号`。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多