2013-04-05 90 views
0

在我的表中,我有一个“名称”列和一个“状态”列。
状态是真或假。
而另一个表包含一个总数的数字。根据状态修改列值,并添加额外的行。 (sql)

我想得到的结果是一张有两列的表格: name |状态
和数据示例:

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

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

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

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

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

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

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

回答

1

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

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

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

你能澄清你的第二秒吗? – 2013-04-05 16:17:14

+0

当然。第一部分的tnx :)我有两张桌子。其中一个数字是我对同一项目的副本总数,第二个说明是否有一些副本可用。那些不在第二个表中的是默认可用的。在我的结果表中,我需要显示每个副本的状态。根据数据,第二张表中的数据可用或不可用,其余数据(如果有)应添加为“可用” – user990635 2013-04-05 16:22:39

+0

如果您认为这是不可能的,它也会对我有所帮助,那么我会只是试图找到另一种解决方案,也许改变表中的东西或任何... – user990635 2013-04-05 16:28:15

0

对于未来的答案者:

为了得到 '假' 行,一个方法是使用是递归的CTE:(有工作SQL Fiddle example

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; 

虽然我有点担心源数据中的初始重复,我只希望还有更多'独特'的信息。