2016-09-20 26 views
0

各PolicyNumberに対して同じ値を取得するサブクエリがあります。どのように私は繰り返された値を ' - 'で置き換えることができ、それは各方針の最上列に1つだけ表示しますか? は今のところ私はこの持っている: enter image description here をしかし、私はこのような何か必要があります:あなたはSQLでそれをやってみたかった場合は、このような何かを行うことができます(あなたはおそらくそれはかなり醜いべきではありません) enter image description here繰り返し値を1回だけ表示し、繰り返す場合は ' - 'を表示する方法

SELECT 
    -------------/* GrossPremium*/ 

      (SELECT ISNULL(SUM(tblFin_InvoiceDetails.AmtBilled), 0) 
       FROM tblFin_InvoiceDetails WITH (NOLOCK) 
       WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
       AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum)) 
       AS GrossPremium 

--------------/*CompanyCommissionPercentage*/ 

       ,((SELECT ISNULL(SUM(tblFin_InvoiceDetails.MGAAmt), 0) 
       FROM tblFin_InvoiceDetails 
       WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
       AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum)) 
       + 
        CASE WHEN INV.Remitter = 'B' then 
        (SELECT ISNULL(SUM(tblFin_InvoiceDetails.RemitterAmt), 0) 
        FROM tblFin_InvoiceDetails 
        WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
        AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum))----------------RemitterCommission 

       ELSE 
        (SELECT ISNULL(SUM(tblFin_InvoicedItemsPayees.PayeeAmt), 0) 
        FROM tblFin_InvoicedItemsPayees 
        INNER JOIN tblFin_PolicyCharges pc on pc.ChargeCode = tblFin_InvoicedItemsPayees.ChargeCode and pc.chargeType = 'P' 
        WHERE (tblFin_InvoicedItemsPayees.InvoiceNum = INV.InvoiceNum and tblFin_InvoicedItemsPayees.PayeeGuid = INV.ProducerLocationGuid)) 
       END) * 100/
       NULLIF((SELECT ISNULL(SUM(tblFin_InvoiceDetails.AmtBilled), 0) 
       FROM tblFin_InvoiceDetails WITH (NOLOCK) 
       WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
       AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum)),0) 
       AS CompanyCommissionPercentage 
FROM [tblFin_PayablesWorking] PW 
INNER JOIN tblFin_Invoices INV ON PW.InvoiceNumber=INV.InvoiceNum 
+0

SQLでは可能ですが、この種の操作は通常、アプリケーション層で行われる方がよいでしょう。 –

+0

ええ、エンドユーザーはExcelでデータを抽出する必要があります。次に、確認し、確認して誰にでも送信してください。そうしたことがあります – Oleg

+0

この場合、ExcelでVBAスクリプトを作成する方が良いかもしれません。私は今日も同じことをやっていましたが、Excel VBAでは5行で簡単に行えます。 –

答えて

1

さてあなたは、あなたの完全なクエリとテーブルのスキーマ言及していないので、私は2つの単純なexample.Ifであなたの答えを与えるあなたが欲しいのは、あなたの繰り返し値が(応じて、列名を変更してくださいこのクエリをたどる-と交換しますあなたのニーズに合わせて)。 既存TABLE選択したい場合:サブクエリを使用するための

;with ts as (
    select S1.[ProductID], row_number() over (partition by S1.[ProductID] order by S1.[ProductID]) as seqnum 
    from (SELECT [SalesID],[ProductID] FROM [Sales]) AS S1 --Replace 'SELECT [ProductID] FROM [Sales]' with your Subquery and change the column accordingly 
) 
SELECT 
(case when seqnum = 1 then [ProductID] ELSE '-' end) as [ProductID] 
FROM ts 

を:

--CREATE TABLE [dbo].[Sales](
-- [SalesID] [uniqueidentifier] NOT NULL DEFAULT (newid()), 
-- [ProductID] [int] NOT NULL, 
-- [EmployeeID] [int] NOT NULL, 
-- [Quantity] [smallint] NOT NULL, 
-- [SaleDate] [datetime] NOT NULL CONSTRAINT [DF_SaleDate] DEFAULT (getdate()), 
-- CONSTRAINT [PK_SalesID] PRIMARY KEY CLUSTERED 
--(
-- [SalesID] ASC 
--)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
--) ON [PRIMARY] 

--GO 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'9498d566-e31b-4ac8-ab54-1c898471fba8', 2, 1, 1, CAST(N'2012-03-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'69c7dff4-fbac-48d3-ae0a-5027c816acd2', 2, 2, 2, CAST(N'2012-04-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'a40b9505-4a2c-4186-a89b-88a401248a58', 1, 1, 4, CAST(N'2012-02-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'04856027-d7ad-40fe-889b-8d933595ffde', 3, 1, 2, CAST(N'2012-02-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'173be2de-3b80-4a3d-8bcc-a74d0d70b3a9', 3, 2, 1, CAST(N'2012-03-01 00:00:00.000' AS DateTime)) 
--GO 



;with ts as (

    SELECT 
    JOIN1.[SalesID] AS [SalesID] 
    , JOIN1.[ProductID] 
    , JOIN1.seqnum AS seqnum 
    , JOIN2.[EmployeeID], JOIN2.seqnum2 AS seqnum2 

    FROM 
    (
    select row_number() over (order by S1.[SalesID] asc) as RowNumber 
    , S1.[SalesID] AS [SalesID] 
    , S1.[ProductID] AS [ProductID] 
    , row_number() over (partition by S1.[ProductID] order by S1.[SalesID]) as seqnum 
    from (SELECT [SalesID],[ProductID] FROM [Sales]) AS S1 --Replace 'SELECT [ProductID] FROM [Sales]' with your Subquery (For Example GrossPremium) and change the column accordingly. Remember you need some thing common for Iner join, in this case [SalesID] 
    )AS JOIN1 

    INNER JOIN 
    (
    select row_number() over (order by S2.[SalesID] asc) as RowNumber 
    , S2.[SalesID] AS [SalesID] 
    , S2.[EmployeeID] AS [EmployeeID] 
    , row_number() over (partition by S2.[EmployeeID] order by S2.[SalesID]) as seqnum2 
    from (SELECT [SalesID],[EmployeeID] FROM [Sales]) AS S2 --Replace 'SELECT [[SalesID]] FROM [Sales]' with your Subquery (For Example CompanyCommissionPercentage) and change the column accordingly. Remember you need some thing common for Iner join, in this case [SalesID] 
    )AS JOIN2 

    ON JOIN1.[SalesID]=JOIN2.[SalesID] 

) 


SELECT 
(case when seqnum = 1 then [ProductID] ELSE '-' end) as [ProductID] 
,(case when seqnum2 = 1 then [EmployeeID] ELSE '-' end) as [EmployeeID] 
FROM (Select TOP 10000000 *FROM ts ORDER BY [SalesID] ASC) AS ts -- Mentioning TOP is Must, or it will give Error 

私はあなたが-代わりNULLの、-はスペース

がかかります使用している理由を知っています
+1

ありがとう!!!!!!!!!!!!!!!!!! – Oleg

0

をLAG()を使用します。これは、各ポリシー番号のレコードをソートするために使用できるフィールドを持つことに依存します。私の下のダミーのデータでは、これを行うRecordIDというフィールドが含まれています。

SELECT 
    PolicyNumber 
    ,CASE 
     WHEN LAG(GrossPremium) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(GrossPremium AS VARCHAR(MAX)) 
     ELSE '-' 
    END GrossPremium 
    ,CASE 
     WHEN LAG(CompanyComissionPercentage) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(CompanyComissionPercentage AS VARCHAR(MAX)) 
     ELSE '-' 
    END CompanyComissionPercentage 
    ,CASE 
     WHEN LAG(RemitterCommissionPercentage) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(RemitterCommissionPercentage AS VARCHAR(MAX)) 
     ELSE '-' 
    END RemitterCommissionPercentage 
    ,CASE 
     WHEN LAG(RemitterCommission) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(RemitterCommission AS VARCHAR(MAX)) 
     ELSE '-' 
    END GrossCommission 
    ,CASE 
     WHEN LAG(RemitterCommission) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(RemitterCommission AS VARCHAR(MAX)) 
     ELSE '-' 
    END GrossCommission 
FROM 
( 
    -- Dummy data 
    SELECT 
      1234 PolicyNumber -- Partition the LAG() on the policy number. 
      ,1 RecordID -- use this to order the LAG() function. 
      ,8749.00 GrossPremium 
      ,18 CompanyComissionPercentage 
      ,10 RemitterCommissionPercentage 
      ,874.90 RemitterCommission 
      ,1574.82 GrossCommission 
    UNION ALL 
    SELECT 
      1234 
      ,2 RecordID 
      ,8749.00 
      ,18 
      ,10 
      ,874.90 
      ,1574.82 
    UNION ALL 
    SELECT 
      5678 
      ,1 RecordID 
      ,8749.00 
      ,18 
      ,10 
      ,874.90 
      ,1574.82 
) x;