データベース

データベースに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Microsoft SQL Server)
文字列同士のAND連結
投稿日時: 20/05/01 12:44:41
投稿者: 富山の初心者

明確なタイトルでなくてすみません。
 

テーブルA_BBBの定義と実データ
-------------------------------------
ID01    ID02    KBN     BBB
Char(4) CHAR(4) CHAR(1) CHAR(100)
-------------------------------------
DT01    SN01    1       1100・・・・
DT01    SN01    2       1010・・・・
DT01    SN02    1       0011・・・・
DT01    SN02    2       0101・・・・
(前提)BBBには0/1以外の文字はないものとする

SQLで求めたい値
ID01    ID020   BBB
-------------------------------------
DT01    SN01    1000・・・・
DT01    SN02    0001・・・・

SQL内容
1.ID01/ID02でグルーピング
2.BBBを1文字づつ分解しANDした値を再連結する
  (ここでいうANDとは両者が1に場合のみ1とし、それ以外は0とする)
 
下記のようなプロシージャを作成してみたのですが、応用ができずに、頓挫しています。
CREATE FUNCTION AA_AND(@C1 VARCHAR(100),@C2 VARCHAR(100),@LL DECIMAL(3))
    RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @CNT INT
    DECLARE @CWK VARCHAR(100)
    SET @CNT=1
    SET @CWK = ''
    WHILE @CNT < @LL
    BEGIN
        IF (substring(@C1,@CNT,1)='1' AND substring(@C2,@CNT,1) = '1') SET @CWK = @CWK + '1'
        ELSE                                                           SET @CWK = @CWK + '0'
        SET @CNT = @CNT + 1
    END
    RETURN @CWK
END
-------------------------------------
テスト結果
SELECT ID01,ID02,dbo.AA_AND((SELECT BBB WHERE KBN = '1'),(SELECT BBB WHERE KBN = '2'),10) GROUP BY ID01,ID02
↓
列名 'ID01' が無効です

よろしく、お願いします。

回答
投稿日時: 20/05/01 17:03:37
投稿者: sk

引用:
SELECT ID01,ID02,dbo.AA_AND((SELECT BBB WHERE KBN = '1'),(SELECT BBB WHERE KBN = '2'),10) GROUP BY ID01,ID02

SELECT [A_BBB_1].[ID01], 
       [A_BBB_1].[ID02], 
       dbo.AA_AND([A_BBB_1].[BBB],[A_BBB_2].[BBB],10) AS [BBB_AND] 
FROM       (SELECT dbo.[A_BBB].* 
            FROM dbo.[A_BBB] 
            WHERE dbo.[A_BBB].[KBN] = '1') AS [A_BBB_1] 
INNER JOIN (SELECT dbo.[A_BBB].* 
            FROM dbo.[A_BBB] 
            WHERE dbo.[A_BBB].[KBN] = '2') AS [A_BBB_2] 
 ON [A_BBB_1].[ID01] = [A_BBB_2].[ID01]
AND [A_BBB_1].[ID02] = [A_BBB_2].[ID02]
ORDER BY [A_BBB_1].[ID01], 
         [A_BBB_1].[ID02];
------------------------------------------------------------------
[ID01],[ID02]の値が同じであるグループにおいて、
[KBN]の値が "1" であるレコードと[KBN]の値が "2" であるレコードが
必ず 1 件ずつ存在する、という場合は、以上のような SQL を
実行なさればよいはず。

投稿日時: 20/05/02 00:55:05
投稿者: 富山の初心者

sk様 ありがとうございます。
 

SELECT V1.ID01
      ,V1.ID02
      ,dbo.AA_AND(V1.BBB,V2.BBB,10) AS BBB_AND 
  FROM      (SELECT ID01,ID02,BBB FROM A_BBB WHERE A_BBB.KBN = '1') AS V1 
 INNER JOIN (SELECT ID01,ID02,BBB FROM A_BBB WHERE A_BBB.KBN = '2') AS V2
    ON V1.ID01 = V2.ID01 AND V1.ID02 = V2.ID02
 ORDER BY V1.ID01
         ,V1.ID02

上記で想定通りの結果が得られました。
ありがとうございました。
 
解決とさせていただきます。