1

3、6、9、12 か月のような賢明な月を表示する必要があるクエリがあります。値を表示する必要があるメンバーシップ金額や null 値を表示する必要がある場合は、実際にはゴールド、シルバー、クラシックなどの月のプランです。 ...これが私のクエリです:

IF OBJECT_ID(N'Tempdb..#months') IS NOT NULL
    DROP TABLE  #months;
        IF OBJECT_ID(N'Tempdb..#membership') IS NOT NULL
    DROP TABLE  #membership;
DECLARE @i_FromCustID INT = 1
DECLARE  @i_BranchId INT,@i_CasteId INT,@i_GenderID INT
    CREATE TABLE #membership
    (
     MembershipName VARCHAR(50),
     Duration INT,
     MemberShipAmount INT
    )

    CREATE TABLE #months(ID IDENTITY()Duration INT)

     SELECT
        @i_BranchId = BranchID,@i_GenderID = GenderID
    FROM 
        Cust_BasicInfo  
    WHERE Cust_ID = @i_FromCustID

    SELECT 
        @i_CasteId = CasteID
    FROM 
        Cust_Details
    WHERE Cust_ID = @i_FromCustID   
        SELECT  @i_BranchId,@i_GenderID,@i_CasteId

        INSERT INTO #months
        SELECT 3
        UNION 
        SELECT 6
        UNION
        SELECT 9
        UNION 
        SELECT 12

Select * From   #months

        --INSERT INTO #membership 
            SELECT CASE 
        WHEN CHARINDEX('_', MembershipName) > 0
            THEN SUBSTRING(MembershipName, 1, CHARINDEX('_', MembershipName) - 1)
        ELSE MembershipName
        END AS NAME,
    MemberShipDuration,
    MembershipAmount,
    ms.Duration
FROM #months ms
LEFT JOIN Emp_MembershipTypes em ON ms.Duration = em.MemberShipDuration
    AND MemberShipTypeID = 236
    AND BranchID = @i_BranchId
    AND CasteID = @i_CasteId
    AND GenderID = @i_GenderID
    AND MembershipName IS NOT NULL
ORDER BY MembershipName

私のアウトプットはこのように来ます:

NAME    MemberShipDuration  MembershipAmount    Duration
Classic 12  1500    12
Classic 12  1500    12
Gold    3   1000    3
Gold    6   1000    6
Gold    9   1000    9
Gold    12  1000    12
Silver  3   1000    3
Silver  6   1   6

しかし、どうすればこのような出力を得ることができますか

NAME    MemberShipDuration  MembershipAmount    Duration
Classic 3   1500    3
Classic 6   NULL    6
Classic 9   NULL    9
Classic 12  NULL    12
Gold    3   1000    3
Gold    6   1000    6
Gold    9   1000    9
Gold    12  1000    12
Silver  3   1000    3
Silver  6   1   6
Silver  9   NULL    9
Silver  12  NULL    12
4

1 に答える 1

1

型を含めるには月を延長し、両方の列に LEFT JOIN する必要があります

このようなもの。

CREATE TABLE #months(Name varchar(20), Duration INT);
..
INSERT INTO #months
SELECT
    X.Name, Y.Duration
FROM
    (VALUES ('Classic'),('Gold'),('Silver')) X(Name)
    CROSS JOIN
    (VALUES (3),(6),(9),(12)) Y(Duration)
...
SELECT
    ms.Name,
    ms.Duration,
    MembershipAmount,
    MemberShipDuration
FROM
    #months ms
    LEFT JOIN Emp_MembershipTypes em ON ms.Duration = em.MemberShipDuration AND
            CASE
                WHEN CHARINDEX('_', MembershipName) > 0 THEN SUBSTRING(MembershipName, 1, CHARINDEX('_', MembershipName) - 1)
                ELSE MembershipName
            END = ms.Name
                    AND MemberShipTypeID = 236
                    AND BranchID = @i_BranchId
                    AND CasteID = @i_CasteId
                    AND GenderID = @i_GenderID
                    AND MembershipName IS NOT NULL
ORDER BY
    ms.Name, ms.Duration

また、(GROUP BYを使用して)SUM(MembershipAmount)も必要になる場合がありますが、わかりにくい...

于 2013-06-24T09:07:19.403 に答える