0

有点难以用语言解释,但我试图让数据按类型分组并由另一个表连接以获得结果。

这是我的SqlFiddle示例。

这是一个示例数据:

(链接表) [id, type, created]

(1, 1, '2013-01-01')
(2, 1, '2013-01-02')
(3, 2, '2013-01-03')
(4, 4, '2013-01-04')

(信息表)[id、link_id、info_type、tally、tick]

(1, 1,1,10,15)
(1, 2,2,20,17)
(1, 3,1,12,14)
(1, 4,2,18,21)

我想要的结果是:[type_a,type_b,tally,tick]

(1, 1, 30, 32)
(1, 0, 12, 14)
(0, 1, 18, 21)

我得到的结果

(2, 2, 30, 32)
(1, 1, 12, 14)
(1, 1, 18, 21)

这是我正在使用的查询

SELECT 
    COUNT(i.info_type) as type_a,
    COUNT(i.info_type) as type_b,
    SUM(i.tally) as tally,
    SUM(i.tick) as tick
FROM link l
JOIN info i ON (l.id = i.link_id)
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01'
GROUP BY l.type

总而言之,我想获取一个日期范围内的所有链接,按 link.type 分组,然后返回等于 1 作为 type_a 和等于 2 作为 type_b 的 info_type 计数以及正确的计数和刻度之和。只是 type_a 和 type_b 结果是错误的。

4

2 回答 2

1
SELECT 
    SUM(i.info_type = 1) AS type_a,
    SUM(i.info_type = 2) AS type_b,
    SUM(i.tally) AS tally,
    SUM(i.tick) AS tick
FROM link l
JOIN info i ON l.id = i.link_id
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01'
GROUP BY l.type ;

TheSUM(i.info_type = 1)是一个 MySQL 习语。更易读的 SQL 代码是:

SELECT 
    COUNT(CASE WHEN i.info_type = 1 THEN 1 ELSE NULL END) AS type_a,
    COUNT(CASE WHEN i.info_type = 2 THEN 1 ELSE NULL END) AS type_b,
    SUM(i.tally) AS tally,
    SUM(i.tick) AS tick
FROM link l
JOIN info i ON l.id = i.link_id
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01'
GROUP BY l.type ;

另一方面,我认为您不应该使用BETWEEN日期。这种情况将包括一整年加一天,我怀疑这是否有用。您可以改用:

WHERE l.created >= '2013-01-01' 
  AND l.created < '2014-01-01'    -- notice the missing equal sign here

这将导致恰好一年的时间间隔,无论该created列是类型DATE还是。DATETIMETIMESTAMP

于 2013-11-14T19:37:52.377 回答
0

我想这是你需要的

SELECT 
    SUM(CASE WHEN MOD(I.INFO_TYPE,2) = 0 THEN 1 ELSE 0 END) as type_B,
    SUM(CASE WHEN MOD(I.INFO_TYPE,2) <> 0 AND MOD(I.INFO_TYPE, 1) = 0
    THEN 1 ELSE 0 END) as type_A,
SUM(I.TALLY) AS TALLY, SUM(I.TICK) AS TICK
FROM link l
JOIN info i ON (l.id = i.link_id)
WHERE l.created BETWEEN '2013-01-01' AND '2014-01-01'
GROUP BY L.TYPE
于 2013-11-14T18:26:26.630 回答