Sql server 可以使用SQL以下面的方式转换数据吗?I';我甚至不确定支点会起作用

Sql server 可以使用SQL以下面的方式转换数据吗?I';我甚至不确定支点会起作用,sql-server,reporting-services,crystal-reports,Sql Server,Reporting Services,Crystal Reports,用户希望数据显示如下: Tax Description ML Total Link Link Link Link Link Link Code Rate Code Rate Rate Code Rate SC001 Abbeville County, SC Y 0.07

用户希望数据显示如下:

Tax       Description             ML   Total    Link  Link      Link     Link      Link     Link
Code                                   Rate     Code  Rate               Rate      Code     Rate

SC001     Abbeville County, SC    Y    0.0700   SC    0.0600    SCLO1    0.0100
SC002     Aiken County, SC        Y    0.0800   SC    0.0600    SCCP1    0.0100    SCEC1    0.0100
Tax     Description             ML  Link            Link
Code                                Rate    Link    Description

SC001   Abbeville County, SC    Y   0.0600  SC      South Carolina State            
SC001   Abbeville County, SC    Y   0.0100  SCLO1   Local Option 1%                 
SC002   Aiken County, SC        Y   0.0600  SC      South Carolina State            
SC002   Aiken County, SC        Y   0.0100  SCCP1   Capital Projects 1%             
SC002   Aiken County, SC        Y   0.0100  SCEC1   Education Capital Improvement
但数据存储在数据库中的方式如下:

Tax       Description             ML   Total    Link  Link      Link     Link      Link     Link
Code                                   Rate     Code  Rate               Rate      Code     Rate

SC001     Abbeville County, SC    Y    0.0700   SC    0.0600    SCLO1    0.0100
SC002     Aiken County, SC        Y    0.0800   SC    0.0600    SCCP1    0.0100    SCEC1    0.0100
Tax     Description             ML  Link            Link
Code                                Rate    Link    Description

SC001   Abbeville County, SC    Y   0.0600  SC      South Carolina State            
SC001   Abbeville County, SC    Y   0.0100  SCLO1   Local Option 1%                 
SC002   Aiken County, SC        Y   0.0600  SC      South Carolina State            
SC002   Aiken County, SC        Y   0.0100  SCCP1   Capital Projects 1%             
SC002   Aiken County, SC        Y   0.0100  SCEC1   Education Capital Improvement
我知道如何使用pivot,但让我感到困惑的是,他们希望看到链接,然后是每个税码旁边的税率。这可能吗


我在SQLServer2012中使用SSR或CrystalReports来实现这一点。

我在SQL中也做了类似的事情。这是我的代码-我没有修改它以适合您的专栏,但它应该是一个很好的起点

SELECT  [report_id]
  ,[id]
  ,[label]
  ,[rate]
  ,[per_trip]
  ,[per_mile]
  ,[per_hour]
  ,[per_year]
 FROM Table1

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @Column1Name AS NVARCHAR(MAX)
DECLARE @Column2Name AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @Column1Name= ISNULL(@Column1Name + ',','') 
   + QUOTENAME(label + ' Column1')
FROM (SELECT DISTINCT label FROM [costmodel].[tractor_cost_report] ) AS Labels

SELECT @Column2Name= ISNULL(@Column2Name + ',','') 
   + QUOTENAME(label + ' Column2')
FROM (SELECT DISTINCT label FROM [costmodel].[tractor_cost_report] ) AS Labels

--Prepare the PIVOT query using the dynamic 
-- the Column Names in the query are the values of the [label] field in the rows of data
SET @DynamicPivotQuery = 
N' SELECT id,
    MAX([Wages and Benefits PerTrip]) as WagesBenefitsAmt,      
    MAX([Fuel & Oil PerTrip]) as FuelOilAmt,    
    MAX([Licence PerTrip]) as LicenceAmt,
    MAX([Insurance PerTrip]) as InsuranceAmt,       
    MAX([Monthly Payment PerTrip])  as MonthlyPaymentAmt,
    MAX([Profit PerTrip]) as ProfitAmt,
    MAX([WCB (%) Rate]) as WCBRate,
    MAX([WCB (%) PerTrip]) as WCBAmt,
    MAX([EI ($) PerTrip]) as EIAmt,
    MAX([CPP ($) PerTrip]) as CPPAmt,
    MAX([Statutory Holiday ($) PerTrip]) as StatPayAmt,
    MAX([Vacation (%) Rate]) as VacationRate,
    MAX([Vacation (%) PerTrip]) as VacationAmt,
    MAX([Pension ($) Rate]) as PensionRate,
    MAX([Pension ($) PerTrip]) as PensionAmt

FROM (
    SELECT id, 
        rate,
        per_trip,
        label + '' PerTrip'' as RowPivot1,
        label + '' Rate'' as RowPivot2 
    FROM [Table1] ) a
PIVOT(SUM(per_trip) 
      FOR RowPivot1 IN (' + @Column1Name + ')) AS PVTTable1
PIVOT(SUM(rate) 
      FOR RowPivot2 IN (' + @Column2Name + ')) AS PVTTable2 
GROUP BY id'

--Execute the Dynamic Pivot Query
print @DynamicPivotQuery
EXEC sp_executesql @DynamicPivotQuery

如果您知道链接不会超过3个,则不需要动态SQL。但是您可以修改它,以使用动态SQL添加所需的链接字段,或者您可以根据需要(或者将其放在报表页面上)放置尽可能多的链接字段


您可以在crystal reports中执行此操作

  • 按税码分组

  • 为所有列创建
    if
    语句,如下所示

  • 例如:描述栏

        if taxcode=Sc001
        then  Description
    else if taxcode=Sc002
        then  Description
    

    如wise for all columns,您将获得所需的输出。

    查找有关dynamic pivot的问题。这是可能的,但我以前做过动态透视,但我从来没有在数据按照他们想要的方式排列的地方做过。使用dynamic pivot是否可能?是否保证链接代码不超过3个?如果是这样的话,您可以不使用pivot或动态SQL,只使用标准联接。不,有多个链接代码,超过3个。只有在我提前知道所有代码是什么的情况下,这才有效,对吗?我想让这个解决方案尽可能通用,这样无论是1个代码还是10个代码都可以运行。是的,这种方法是在crystal reports中对数据进行硬编码。。。。若我知道整个设计,那个么通用的方法可以被认为是我真的不想硬编码任何东西,若我可以避免的话。他们想要查看数据的方式与从选择查询返回数据的方式一样,都在原始问题中。