【问题标题】:Inserting a count of a total into a temp table with a conditional statement?使用条件语句将总数插入临时表?
【发布时间】:2016-10-07 21:43:37
【问题描述】:

我有一些看起来像这样的数据:

P     D
1     0
1     0
.63   1
.72   1
etc...

现在我有一个带有 3 个值的临时表,我想使用第一个表来创建这个表,它根据某些条件保存这些值的总数。

这是一个执行此操作的语句,但它只能工作一次,而且我对 SQL 不是很好,但有人可以告诉我如何动态地完成这样的事情吗?

INSERT INTO #distribution values(
(SELECT count(P)
FROM myTable
WHERE P > 0.90 AND D = 0), 1, 1)

临时表中的最后 2 个值将根据检查的条件而改变。

例如,这是我的另一个条件:

WHERE (P BETWEEN 0.80 AND 0.90) AND (D BETWEEN .01 AND .25), 1,2

我想我需要一个案例陈述,但我想不出如何做到这一点。


编辑:另外两列也会在某些情况下发生变化。

例如:

WHERE (P > 0.90) AND (D BETWEEN .01 AND .25),2,1

【问题讨论】:

    标签: sql sql-server datatable


    【解决方案1】:

    考虑到这会进入结构化编程领域而不是事务性编程领域,这是 SQL 不太擅长的事情。正如你所提到的,鉴于我将使用案例陈述。像这样的:

    insert into #distribution
    select count(*),
           case t.conditions
            when 1 then 1
            when 2 then 1
            [more conditions...]
           end,
           case t.conditions
            when 1 then 1
            when 2 then 2
            [more conditions...]
           end
    from (
        select case
            when P > 0.90 and D = 0 then 1
            when P >= 0.80 and P <= 0.90 and D >= .01 and D <= .25 then 2
            [more conditions...]
        end as conditions
        from myTable
        ) as t
    group by conditions
    

    【讨论】:

    • 这可能是我想要的。我试试看谢谢。
    【解决方案2】:

    如果我理解,我不确定 100%,但我认为你想要类似的东西:

    INSERT INTO #distribution
    SELECT COUNT(1), 1, 1
    FROM MyTable
    WHERE P > 0.90 AND D = 0
    UNION ALL
    SELECT COUNT(1), 1, 2
    FROM MyTable
    WHERE (P BETWEEN 0.80 AND 0.90) AND (D BETWEEN .01 AND .25)
    

    或者你可以这样做:

    SELECT b.TypeCount, a.VALUE1, a.VALUE2
    FROM 
       (SELECT 1 AS TypeId, 1 AS VALUE1, 1 AS VALUE2
       UNION ALL
       SELECT 2, 1, 2) ValueTable
    JOIN  (SELECT CASE WHEN P > 0.90 AND D = 0  THEN 1 
       WHEN (P BETWEEN 0.80 AND 0.90) AND (D BETWEEN .01 AND .25) THEN 2 END AS TypeId,
       COUNT(1) TypeCount
       FROM MyTable
       GROUP BY SELECT CASE WHEN P > 0.90 AND D = 0  THEN 1 
       WHEN (P BETWEEN 0.80 AND 0.90) AND (D BETWEEN .01 AND .25) THEN 2 END) AS Data
    ON Data.TypeId = ValueTable.TypeId
    

    【讨论】:

      【解决方案3】:

      我想这就是你想要的:

      insert into #distribution(col1, col2, col3)
          select count(*), 1, grp
          from (select (case when P > 0.90 and D = 0 then 1
                             when P >= 0.80 and P <= 0.90 and D >= .01 and D <= .25 then 2
                        end) as grp
                from myTable
              ) as t
          where grp is not null
          group by grp;
      

      注意:您应该列出insert 的列。

      【讨论】:

        猜你喜欢
        • 2019-12-10
        • 1970-01-01
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-03-30
        • 2012-07-31
        • 1970-01-01
        相关资源
        最近更新 更多