如何根据条件在SQL中输出静态行

时间:2018-11-12 09:38:34

标签: sql

我需要弄清如何基于不在数据库中的条件来静态输出行。

示例数据库:

+ -------+-------+
| STATUS | SUM   |
+ -------+-------+
| P      | 1,000 |
| E      | 5,000 |
+ -------+-------+

所需的输出

+ -------+-------+
| STATUS | SUM   |
+ -------+-------+
| P      | 1,000 |
| E      | 5,000 |
| N      |     0 |
+ -------+-------+

基本上-如果“ N”不在数据库中,我需要输出N状态总和为0的行。之所以需要这样做是因为以后要格式化。这是关于文件处理数据的,尽管有些月份的文件可能处于P,E和N这三种状态,但其他月份的文件可能只有P和E。无论月份如何,我都需要一致的输出。

3 个答案:

答案 0 :(得分:2)

假设两栏分别是“状态”和“总和”;

SELECT [Status], [SUM]
FROM YOURTABLE
UNION
SELECT 'N' AS [Status], 0 AS [SUM]

答案 1 :(得分:0)

我强烈建议您避免对SQL查询中的静态行进行硬编码,而是创建一个单独的表,其中包含每种状态的“默认”值,例如:

+ -------+-------+
| STATUS | SUM   |
+ -------+-------+
| P      |     0 |
| E      |     0 |
| N      |     0 |
+ -------+-------+

然后,您可以使用LEFT JOIN构造查询,以始终包含该状态表中的所有记录,例如:假设默认表名为MyDefaults,而数据表名为{{1} }:

MyTable

答案 2 :(得分:0)

在我看来,您希望在该表的列上使用SUM,假设它的名称为COLUMN_NAME,并且该表的名称为TABLE_NAME
如果是这种情况,那么您必须对表进行加总运算,并在两行中​​包含包含值'N''0'的行。
这样可以确保'N'会出现在最终结果中,即使已经存在0也不会因为SELECT STATUS, SUM(COLUMN_NAME) FROM (SELECT STATUS, COLUMN_NAME FROM TABLE_NAME UNION SELECT 'N', 0) GROUP BY STATUS 而损害最终金额:

@receiver(post_save,sender=Data)
def on_batch_child_saving(sender,instance,**kwargs):
    batch_instance = Batch.objects.get(pk=instance.batch)
    if (instance.timestamp < batch_instance.start): 
        batch_instance.start = instance.timestamp
        batch_instance.save()

    elif (instance.timestamp > batch_instance.end):
        batch_instance.end = instance.timestamp
        batch_instance.save()