0

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

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

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

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

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

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

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

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

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

4

2 回答 2

1

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

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

SELECT  name,
        CASE WHEN status = 'true' 
            THEN 'available' 
            ELSE 'not available' 
        END status
FROM    tableName
于 2013-04-05T16:13:49.360 回答
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 示例。)

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

于 2013-04-05T16:54:25.943 回答