2013-04-05 53 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; 

雖然我有點擔心源數據中的初始重複,我只希望還有更多'獨特'的信息。