根据状态修改列值,并添加额外的行。 (SQL)

时间:2013-04-05 16:12:20

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

在我的表格中,我有一个“名称”列和一个“状态”列 状态是真还是假 另一个表包含一个总数量的数字。

我想得到的结果是一个包含两列的表: 名字|状态
和数据的例子:

a |可
a |可
a |不可用的 a |不可用的 a |可用

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

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

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

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

例如,如果我有3条“a”记录,当一条状态为“true”而另外两条状态为“false”时,总数为4,结果我需要得到4条名称为“a”的行,其中2个为“available”,2个为“not available”(给定3行,加上一行使其为4)。

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

2 个答案:

答案 0 :(得分:1)

  

“...如何根据表格中的数据更改值?”

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

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

答案 1 :(得分:0)

对于未来的求职者:

获得“假冒”'行,一种方法是使用递归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。)

我有点担心源数据中的初始重复;我只能希望有更多独特的&#39;信息也是如此。