2012-01-17 4 views
1

今日私はquestionに尋ねましたが、多値フィールドの複雑さが増しています。私が知りたい多値フィールドを持つ同じテーブルの異なる条件で複数のレコードの数を見つける方法

ID lightness | darkness  | color 
------|-------------|--------------|--------- 
1  |10   | 20   | green, blue, yellow 
2  |10   | 08   | green, purple, orange 
3  |10   | 10   | black, magenta, orange 
4  |20   | 05   | green, creame 
5  |10   | 20   | red, purple 
6  |10   | 16   | red, white 
7  |33   | 20   | brown, red 
8  |10   | 10   | green, blue 

は、次のような表がある色は、色が闇20 を持っていたレコードの明るさ10

  • カウントを持っているレコードの

    • カウントを

      最終出力は

      です。
      Color | lightness | darkness | Total 
      ---------|-------------|------------|--------- 
      green | 4   | 1   | 5 
      red  | 2   | 2   | 4 
      Total | 6   | 3   | 9 
      

      group byは値を失い、結果は正しくありません。例については :.valueはので、私は次の操作を行うことができ、多値フィールド上で使用することができます

      select * from colortable where color.value = 2 
      

      緑、赤が

      存在するすべてのレコードを表示します

      select * from colortable where color.value = 3 
      

      存在するすべてのレコードを表示します

      これは本当に悪いデザインだと私は理解していますが、これを継承してデータに対してクエリを実行する必要があります。

  • +2

    あなたがデザインを変更する任意の能力を持っていますか?私は、あなたがこのようなテーブルを残している「スペース節約」よりも、これを適切に正規化している頭痛が増えていることを保証します。また、 '合計'行は、レポートプログラムに残すのが最も良いのですが、SQLエンジン自体にはありません。 –

    +0

    [合計]行を追加しないでも問題ありません。デザインを変更することについては、人が使うアプリケーションのフロントエンドを変更することもできます。あなたの質問に答えるために、私はそれを変更するためのアクセスと意思を持っていますが、既存のデザインからクエリを抽出し、結果を抽出したいと考えました。 – Anthony

    答えて

    2

    で各色ごとにあなたに1つの行を与えますそのテーブルに新しいテーブルは次のようになります

    ID | cid | color 
    ---|-----|------- 
    1 | 2 | green 
    2 | 3 | red 
    

    これで、あなたは何かに参加することができました!

    SELECT p.color, 
         Sum(IIf(lightness=10,1,0)) as lightness, 
         Sum(IIf(darkness=20,1,0)) as darkness, 
         lightness+darkness AS Total 
    FROM colortable c inner join predefinedcolors p on p.id = c.color.value 
    WHERE c.color.value in (2,3) 
    GROUP BY c.color, p.conditionid.value 
    
    0

    既知の色がある場合は、たとえば「KnownColors」という表を作成する必要があります。

    SELECT ColourTable.ID, KnownColour, ColourTable.Lightness, ColourTable.Darkness, 
    ColourTable.Colour, ColourTable.Lightness, ColourTable.Darkness 
    FROM ColourTable, knownColours WHERE (((ColourTable.Colour) Like "*" 
    & [KnownColour] & "*") AND ((ColourTable.Lightness)=10) 
    AND ((ColourTable.Darkness)=20)); 
    

    は明度が10で、闇があなたがマルチフィールド値列を持っているので、あなたの最善の解決策は、新しいテーブルを作成し、すべての既知の色を投げることである20

    0

    次のあなたのテーブルの使用から、あなたの結果を得ることができ、

    
    -- ** Function for creating column from colors ** 
    
    CREATE FUNCTION [dbo].[Split](@String varchar(8000), @Delimiter char(1))  
    returns @temptable TABLE (items varchar(8000))  
    as  
    begin  
        declare @idx int  
        declare @slice varchar(8000)  
    
        select @idx = 1  
         if len(@String)0) 
          insert into @temptable(Items) values(RTRIM(LTRIM(@slice)))  
    
         set @String = right(@String,len(@String) - @idx)  
         if len(@String) = 0 break  
        end 
    return  
    end 
    GO 
    
    -- ** Create view to get all colors in one column ** 
    
    Create view [dbo].[vColors] 
    as 
    select distinct items from split(
    (SELECT SUBSTRING(
    (SELECT ',' + color 
    FROM colortable 
    ORDER BY color 
    FOR XML PATH('')),2,200000) AS CSV_Color),',') 
    
    GO 
    
    -- ** And Finally get the result from this query ** 
    
    select items,sum(lightness)lightness,sum(darkness)darkness 
    from colortable c inner join vcolors v on c.color like '%'+v.items+'%' 
    group by items 
    
    -- ** output is ** 
    
    items lightness darkness 
    ------------------------------- 
    black  10  10 
    blue  20  30 
    brown  33  20 
    creame  20  5 
    green  50  43 
    magenta  10  10 
    orange  20  18 
    purple  20  28 
    red   53  56 
    white  10  16 
    yellow  10  20 
    
    
    +0

    はいこれはT-SQLです。 – Kishor

    +1

    T-SQLはMS Accessで動作しませんが、私は投票するように誘惑されましたが、SQLが汎用タグであることに気付かないのでしょうか?かなりの種類のSQLがあります。ここで必要なのは、MS Accessで使用されているJet/ACE SQLです。 – Fionnuala

    関連する問題