Sql coalesce() 无法正常工作的问题
Sql trouble with coalesce() not working propely
我有一个查询,但我无法将 columb name 最后一行的名称更改为 'TOTAL'。结果给了我最后一行上方的行的相同名称。
这是我的查询:
SELECT COALESCE(ticket_types.name,'TOTAL') AS name,
COUNT(1) AS quantity
FROM tr_logs
LEFT JOIN tickets ON tr_logs.value = tickets.id
LEFT JOIN ticket_types ON tickets.ticket_type_id = ticket_types.id
LEFT JOIN transactions ON tr_logs.transaction_id = transactions.id
LEFT JOIN tr_fields_data AS tfd_shipping ON tfd_shipping.transaction_id = transactions.id
WHERE type = 'ADDITEM'
AND transactions.event_id = '46'
AND DATE(tr_logs.created_date)
BETWEEN '2017-03-26' AND '2017-05-24'
AND tfd_shipping.data IN ('0','570','571','771')
AND name IS NOT NULL
GROUP BY ticket_types.id WITH ROLLUP
结果如下所示:
name quantity
premium 56
outlaw 6
outlaw 62
汇总的最后一行名称不为空....我需要它是总计而不是非法的
谢谢
您根本没有将名称更改为 TOTAL
:您已将列的名称更改为 name
,并告诉它用 TOTAL
.
如果你想把ticket_types.name
的名字改成total
,你只需要
SELECT ticket_types.name AS total ...
(但将 name
重命名为 total
会很奇怪,因此您可能需要稍微澄清一下您的要求。)
这可能与您观察到的问题有关,也可能无关,但是 WHERE
和 GROUP BY
子句将所有外连接转换为内连接。您应该将查询简化为:
SELECT COALESCE(tt.name, 'TOTAL') AS name, COUNT(1) AS quantity
FROM tr_logs l JOIN
tickets
ON l.value = t.id JOIN
ticket_types tt
ON t.ticket_type_id = tt.id JOIN
transactions tr
ON l.transaction_id = tr.id JOIN
tr_fields_data fd
ON fd.transaction_id = tr.id
WHERE type = 'ADDITEM' AND
tr.event_id = '46' AND
DATE(l.created_date) BETWEEN '2017-03-26' AND '2017-05-24' AND
fd.data IN ('0', '570', '571', '771') AND
tt.name IS NOT NULL
GROUP BY tt.id WITH ROLLUP
感谢 Gordon Linoff,我解决了我的问题。
最后一行的名称永远不会为空,因为我 GROUP BY 具有不同的属性。
这是解决方案。
SELECT COALESCE(tckn,'TOTAL') AS name, quantity FROM
(SELECT tt.name AS tckn, COUNT(1) AS quantity
FROM tr_logs AS l
LEFT JOIN tickets AS t ON l.value = t.id
LEFT JOIN ticket_types AS tt ON t.ticket_type_id = tt.id
LEFT JOIN transactions AS tr ON l.transaction_id = tr.id
LEFT JOIN tr_fields_data AS tfd ON tfd.transaction_id = tr.id
WHERE type = 'ADDITEM'
AND tr.event_id = '46'
AND DATE(l.created_date)
BETWEEN '2017-03-26' AND '2017-05-24'
AND tfd.data IN ('0','570','571','771')
GROUP BY tckn WITH ROLLUP) as sum;
我有一个查询,但我无法将 columb name 最后一行的名称更改为 'TOTAL'。结果给了我最后一行上方的行的相同名称。 这是我的查询:
SELECT COALESCE(ticket_types.name,'TOTAL') AS name,
COUNT(1) AS quantity
FROM tr_logs
LEFT JOIN tickets ON tr_logs.value = tickets.id
LEFT JOIN ticket_types ON tickets.ticket_type_id = ticket_types.id
LEFT JOIN transactions ON tr_logs.transaction_id = transactions.id
LEFT JOIN tr_fields_data AS tfd_shipping ON tfd_shipping.transaction_id = transactions.id
WHERE type = 'ADDITEM'
AND transactions.event_id = '46'
AND DATE(tr_logs.created_date)
BETWEEN '2017-03-26' AND '2017-05-24'
AND tfd_shipping.data IN ('0','570','571','771')
AND name IS NOT NULL
GROUP BY ticket_types.id WITH ROLLUP
结果如下所示:
name quantity
premium 56
outlaw 6
outlaw 62
汇总的最后一行名称不为空....我需要它是总计而不是非法的
谢谢
您根本没有将名称更改为 TOTAL
:您已将列的名称更改为 name
,并告诉它用 TOTAL
.
如果你想把ticket_types.name
的名字改成total
,你只需要
SELECT ticket_types.name AS total ...
(但将 name
重命名为 total
会很奇怪,因此您可能需要稍微澄清一下您的要求。)
这可能与您观察到的问题有关,也可能无关,但是 WHERE
和 GROUP BY
子句将所有外连接转换为内连接。您应该将查询简化为:
SELECT COALESCE(tt.name, 'TOTAL') AS name, COUNT(1) AS quantity
FROM tr_logs l JOIN
tickets
ON l.value = t.id JOIN
ticket_types tt
ON t.ticket_type_id = tt.id JOIN
transactions tr
ON l.transaction_id = tr.id JOIN
tr_fields_data fd
ON fd.transaction_id = tr.id
WHERE type = 'ADDITEM' AND
tr.event_id = '46' AND
DATE(l.created_date) BETWEEN '2017-03-26' AND '2017-05-24' AND
fd.data IN ('0', '570', '571', '771') AND
tt.name IS NOT NULL
GROUP BY tt.id WITH ROLLUP
感谢 Gordon Linoff,我解决了我的问题。
最后一行的名称永远不会为空,因为我 GROUP BY 具有不同的属性。
这是解决方案。
SELECT COALESCE(tckn,'TOTAL') AS name, quantity FROM
(SELECT tt.name AS tckn, COUNT(1) AS quantity
FROM tr_logs AS l
LEFT JOIN tickets AS t ON l.value = t.id
LEFT JOIN ticket_types AS tt ON t.ticket_type_id = tt.id
LEFT JOIN transactions AS tr ON l.transaction_id = tr.id
LEFT JOIN tr_fields_data AS tfd ON tfd.transaction_id = tr.id
WHERE type = 'ADDITEM'
AND tr.event_id = '46'
AND DATE(l.created_date)
BETWEEN '2017-03-26' AND '2017-05-24'
AND tfd.data IN ('0','570','571','771')
GROUP BY tckn WITH ROLLUP) as sum;