【问题标题】:Modifying column value according to status, and adding extra rows. (sql)根据状态修改列值,并添加额外的行。 (SQL)
【发布时间】:2013-04-05 16:12:20
【问题描述】:

在我的表格中,我有一个“名称”列和一个“状态”列。
状态为真或假。
另一个表包含一个数字,即总金额。

我想要得到的结果是一个包含两列的表: 姓名 |状态
以及数据示例:

一个 |可用
一个 |可用
一个 |不可用
一个 |不可用
一个 |可用

当“a”在名称列中并且可用性是状态列时。

第二个表的总量表示我需要拥有的“a”行的总数,状态取决于原始表中状态列的真/假。

如果状态为“真”,我需要写“可用”,当“假”时,“不可用”。

如果总金额值大于我在第一个表中的数据,我需要根据状态为“可用”的总金额添加行。

例如,如果我有3条记录“a”,当一条状态为“true”,另外两条状态为“false”,总金额为4,结果我需要得到4名称为“a”的行,其中 2 行“可用”,2 行“不可用”(给定的 3 行,加上一行使其成为 4)。

我的问题是,如何根据表中的数据更改值? (写可用/不可用)
以及如何添加一定数量的具有预设值的行(与以前相同的名称和“可用”状态)?

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    "...如何根据表中的数据更改数值?"

    您可以使用CASE() 来测试列的值。

    SELECT  name,
            CASE WHEN status = 'true' 
                THEN 'available' 
                ELSE 'not available' 
            END status
    FROM    tableName
    

    【讨论】:

    • 你能在第二秒澄清更多吗?
    • 当然。第一部分的 tnx :) 我有两张桌子。一个的数字是我拥有的同一项目的副本总数,第二个表示是否有一些副本可用。不在第二个表中的那些默认是可用的。在我的结果表中,我需要显示每个副本的状态。第二个表中的根据数据要么可用要么不可用,其余的,如果有的话,应该添加为“可用”
    • 如果你认为这是不可能的,它也会对我有所帮助,然后我会尝试寻找另一种解决方案,也许改变表格中的某些内容或其他什么......
    • 其实我想到了另一种方法,添加一个包含更详细内容的表格,然后我不需要添加假行,因为我将拥有所有数据......所以谢谢第一部分!我仍然需要它:)所以我会选择你的答案,再次非常感谢:))
    【解决方案2】:

    对于未来的答案寻求者:

    要获取“假”行,一种方法是使用递归 CTE:

    WITH Expanded_Data as (SELECT Counted_Data.name, 
                                  CAST('true' as VARCHAR(5)) as status, 
                                  Counted_Data.count + 1 as count, 
                                  Total.count as limit
                           FROM (SELECT name, COUNT(*) as count
                                 FROM Data 
                                 GROUP BY name) Counted_Data
                           JOIN Total 
                             ON Counted_Data.name = Total.name
                                AND Counted_Data.count < Total.count
                           UNION ALL
                           SELECT name, status, count + 1, limit
                           FROM Expanded_Data 
                           WHERE count < limit)
    
    SELECT name, CASE WHEN status = 'true' 
                      THEN 'available'
                      ELSE 'not available' END
    FROM (SELECT name, status
          FROM Data
          UNION ALL
          SELECT name, status
          FROM Expanded_Data) d;
    

    (有一个工作的SQL Fiddle example。)

    不过,我有点担心源数据中的初始重复;我只能希望还有更多“独特”的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2017-06-29
      • 1970-01-01
      相关资源
      最近更新 更多