缺少SQL请求中的行,其中count为0,按值范围

时间:2018-05-16 09:23:43

标签: sql database sqlite

我的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;

关于如何解决的任何想法?

谢谢你!

4 个答案:

答案 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