sql >> データベース >  >> RDS >> Sqlserver

FOR XML を使用している SQL クエリに SQL ケース ステートメントを埋め込む

    元のケース式を正しい場所に挿入するとうまくいくと思います。これを試してください:

    PROCEDURE [dbo].[CreateLandingPurchaseOrderDetails]
    
    -- Add the parameters for the stored procedure here
    @startDate DATE, @endDate DATE
    
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
    
        -- Insert statements for procedure here
        SELECT (
           SELECT
                Contacts.ContactId AS '@ContactId',
                LandingHeaders.VesselOwner AS '@Owner',
                FORMAT(SUM(LandingDetails.Quantity * LandingDetails.UnitPrice), 'N2') AS '@Owed',
                SocietyMemberships.WeeklyDeductionRate AS '@WeeklyDeductionRate',
                SocietyMemberships.FromMinimumReturn AS '@FromMinimumReturn',
                Deductions.DeductionRate AS '@DeductionRate',
    
              CASE 
                 WHEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) - (SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate) > FromMinimumReturn 
                 THEN SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate + WeeklyDeductionRate
                 ELSE SUM(LandingDetails.Quantity * LandingDetails.UnitPrice) * DeductionRate 
              END AS '@TotalDeductions',
    
                (SELECT DISTINCT
                    ld1.ProductId AS '@ProductId',
                    FORMAT(AVG(ld1.UnitPrice), 'N2') AS '@Cost',
                    FORMAT(SUM(ld1.Quantity), 'N2') AS '@Quantity'
    
                FROM LandingDetails ld1
                INNER JOIN dbo.LandingHeaders lh1
                    ON ld1.LandingId = lh1.LandingId
                WHERE Posted = 0
                AND lh1.VesselOwner = LandingHeaders.VesselOwner
                GROUP BY ld1.ProductId
                FOR XML PATH ('Products'), TYPE)
    
            FROM dbo.LandingDetails
            INNER JOIN dbo.LandingHeaders
                ON LandingDetails.LandingId = LandingHeaders.LandingId
            INNER JOIN dbo.Vessels
                ON LandingHeaders.VesselId = Vessels.VesselId
            INNER JOIN dbo.Contacts
                ON Vessels.OwnerId = Contacts.ContactId
            INNER JOIN dbo.SocietyMemberships
                ON Contacts.SocietyId = SocietyMemberships.SocietyId
            INNER JOIN dbo.Deductions
                ON Vessels.DeductionId = Deductions.DeductionId
            WHERE LandingHeaders.Posted = 0
            AND LandingDate1 BETWEEN @startDate AND @endDate
            GROUP BY    ContactId,
                        LandingHeaders.VesselOwner,
                        SocietyMemberships.WeeklyDeductionRate,
                        SocietyMemberships.FromMinimumReturn,
                        Deductions.DeductionRate
            ORDER BY ContactId
    
            FOR XML PATH ('Owner'), TYPE)
    
        FOR XML PATH ('PurchaseOrders'), TYPE
    
    END
    

    クエリは改善される可能性がありますが、テーブル定義といくつかのサンプル データがないと、テストするのが少し難しくなります。

    この SQL Fiddle を確認してください わずかに微調整したバージョンでも同じ結果が得られます。




    1. Oracleで動作するファイルアップロードをgrailsで作成するにはどうすればよいですか?

    2. (My)SQLインジェクションを防ぐために、どの文字をエスケープする必要がありますか?

    3. PHPデータベースの日付フィールドとPHPの日付

    4. 外部/リモート接続用にRaspberryPiでMySQLを開くにはどうすればよいですか?