我的SQL请求中有一些缺少行的问题。我想显示按值分组的出现次数,即使表中没有值,表也需要显示它们。
以下是它现在显示的内容
|---------------------|------------------|
| Category | Amount |
|---------------------|------------------|
| <= 0 | 34 |
|---------------------|------------------|
| ]0 - 1] | 18 |
|---------------------|------------------|
| > 2 | 25 |
|---------------------|------------------|
这就是我需要它来展示
|---------------------|------------------|
| Category | Amount |
|---------------------|------------------|
| <= 0 | 34 |
|---------------------|------------------|
| ]0 - 1] | 18 |
|---------------------|------------------|
| ]1 - 2] | 0 |
|---------------------|------------------|
| > 2 | 25 |
|---------------------|------------------|
到目前为止我的代码是:
SELECT t.range AS Category,
Count( * ) AS [Amount],
FROM (
SELECT value,
CASE
WHEN (value <= 0) THEN ' <= 0 '
WHEN (value > 0 AND value <= 1) THEN ' ]0 - 1]'
WHEN (value > 1 AND value <= 2) THEN ' ]1 - 2]'
WHEN (value > 2 ) THEN ' > 2 '
END AS range
FROM Table
)
t
GROUP BY t.range;
关于如何解决的任何想法?
谢谢你!
答案 0 :(得分:2)
只需执行多个查询然后联合所有:
SELECT ' <= 0 ' AS category, count(*) as Amount FROM MyTable WHERE value <= 0
UNION ALL
SELECT ' ]0 - 1]' AS category, count(*) FROM MyTable WHERE value > 0 AND value <= 1
UNION ALL
SELECT ' ]1 - 2]' AS category, count(*) FROM MyTable WHERE value > 1 AND value <= 2
UNION ALL
SELECT ' > 2 ' AS category, count(*) FROM MyTable WHERE value > 1 AND value > 2
答案 1 :(得分:1)
让我们在这里谈谈。
第一个选项:在应用程序逻辑中处理它?</ strong>
我想我更喜欢这个,但它当然取决于你需要做什么。
第二个选项:使用列而不是行
SELECT pos.r, COUNT(1) Amount
FROM (
SELECT ' <= 0 ' r
UNION SELECT ' ]0 - 1]' r
UNION SELECT ' ]1 - 2]' r
UNION SELECT ' > 2 ' r
) pos
LEFT OUTER JOIN (
SELECT value,
CASE
WHEN (value <= 0) THEN ' <= 0 '
WHEN (value > 0 AND value <= 1) THEN ' ]0 - 1]'
WHEN (value > 1 AND value <= 2) THEN ' ]1 - 2]'
WHEN (value > 2 ) THEN ' > 2 '
END AS range
FROM Table
) actual ON pos.r = actual.range
GROUP BY pos.r
第3个选项:单独子查询中的硬编码选项(您最初想要的那个)
jQuery(document).on("click", ".single-product .single_add_to_cart_button", function(){
jQuery('#Content').modal("show");
return false;
});
答案 2 :(得分:0)
您总是定义类别,因此我觉得它应该是table
:
类别(id,范围)
和insert
您的范围table
。完成此操作后,解决方案就像select
from
categories
left join
与另一个table
一样简单,条件是{ {1}}符合您指定的value
。对于那些没有值的组,range
的结果为null
,因此如果组中没有记录,则需要使用count
确保它为0
我不熟悉SqLite,但在其他RDBMS中,您可以向查询添加ifnull
,此处varchar
将评估您存储的varchar
每个类别,但如果这不是SqLite中的选项,那么您可以编写range
,它将根据可能的stored function
值进行比较。这也不应该是非常困难的,但是如果你能以某种方式内联评估range
字符串,那么它应该是首选的(但只有在排除任何注入范围的可能性时才会这样,但这是一个不同的主题)。
答案 3 :(得分:0)
select
CASE
WHEN (startRange <= 0) THEN ' <= 0 '
WHEN (startRange > 0 AND startRange <= 1) THEN ' ]0 - 1]'
WHEN (startRange > 1 AND startRange <= 2) THEN ' ]1 - 2]'
WHEN (startRange > 2 ) THEN ' > 2 '
END AS 'range',
count(m.val) TotalCount
from test m right outer join(
select -100 startRange,0 endrange union all
select 0 startRange, 1 endrange union all
select 1 startRange, 2 endrange union all
select 2 startRange, 3 endrange union all
select 3 startRange, 4 endrange
)r
on m.val >=startrange
and m.val < endrange
group by r.startRange, r.endRange;
为范围和右外连接创建一个临时表可以解决问题。 请参阅https://stackoverflow.com/a/15276614/5196927