0

sqlserver2005を使用しています。次のテーブルがあります。

CREATE TABLE [dbo].[Proyectos2](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Proyecto] [varchar](255) NULL
)
CREATE TABLE [dbo].[Clientes2](

[Vendedora] [varchar](255) NULL,
[Proyecto] [varchar](255) NULL  )



 insert into proyectos2
values
(
'Proyecto1'
)
insert into proyectos2
values
(
'Proyecto2'
)
insert into clientes2
values
(
'Jessica','Proyecto1'
)
insert into clientes2
values
(
'Jessica','Proyecto1'
)
insert into clientes2
values
(
'Mariel','Proyecto2'
)

次に、このクエリ:

    Declare @Names As Varchar(Max), @strSQL Varchar(Max);
DECLARE @sum AS varchar(MAX);
Select @Names = Stuff((Select ',' + QuoteName(Proyecto)
From Proyectos2 Group By Proyecto Order by Proyecto For XML Path('')), 1, 1, '');
Select @sum = Stuff(
(
Select ', 1.0 * SUM(' + QuoteName(Proyecto) + ') as ' + QuoteName(Proyecto)
From Proyectos2 
Group By Proyecto 
Order by Proyecto For XML Path('')
), 1, 1, '') + ', SUM(Total) as Total';
Set @strSQL = 'select case when grouping(Vendedora) = 1 then ''Grand Total'' else Vendedora end as Vendedora, ' + @sum + N'
from (
Select Vendedora, ' + @Names +  ', (' + REPLACE(@Names, '],[', '] + [') + ') as Total' + 
' From (Select Vendedora, Proyecto From Clientes2) as P 
 Pivot (Count(Proyecto) For Proyecto in (' + @Names + ')) As Pvt
) as S
group by
    Vendedora
    with rollup';
SET @strSQL = 'WITH CTE AS ( ' + @strSQL + ' ) ' +
              'SELECT Vendedora,cast(floor(Proyecto1) as varchar) Proyecto1,cast(floor(Proyecto2) as varchar)Proyecto2,Total FROM CTE UNION ALL ' +
              'SELECT ''Porcentaje'',cast( ' + REPLACE(@Names, '],[', '] / Total as varchar) Proyecto1, cast([') + ' / Total as varchar), ''100''' +
              '  FROM CTE ' +
              ' WHERE Vendedora = ''Grand Total'';';
print @strSQL;
Execute (@strSQL);
GO

このコードを実行すると、次のように表示されます。

Vendedora------Proyecto1--------------Proyecto2-----Total
Jessica-------------2-------------------0--------------2
Mariel--------------0-------------------1--------------1
Grand Total---------2-------------------1--------------3
Percentage----------0.666666666666------0.333333333333---100

私はこのようなものが欲しいです:

Vendedora------Proyecto1--------------Proyecto2-----Total
Jessica-------------2-------------------0--------------0.66
Mariel--------------0-------------------1--------------0.33
Grand Total---------2-------------------1--------------1
Percentage----------0.66--------------0.33------------------100

つまり、最後の行の小数点以下2桁、および各行の合計です。

これを行う方法はありますか?

ありがとう。

4

3 に答える 3

0

必要な値をパーセンテージ(0.33など)に100.0を掛けてから、それをintにキャストして、値を小数点以下のないパーセンテージに切り捨てます。

cast(percentage * 100.0 as int) as percentage
于 2012-04-16T18:35:53.747 に答える
0

各行の合計が最終的な総計のパーセンテージである必要があるというあなたの発言に焦点を当てています。

そのためには、各ラインを作成する前に総計を知る必要があります。SSRS、ActiveReports、CrystalReportsなどのレポートツールでこれを行うのが本当に最善です。

しかし、あなたが尋ねたので:これは私が取るアプローチです:

ETA:より具体的に書き直されました。これはまだ例であり、状況に合わせて調整する必要があることに注意してください。

WITH CTE AS ( <@strSQL> ),
     CTE2 AS (
       SELECT Vendedora, 
              cast(floor(Proyecto1) as varchar) Proyecto1,
              cast(floor(Proyecto2) as varchar) Proyecto2,
              Total 
       FROM   CTE),
       SELECT   Vendedora,
              Proyecto1,
              Proyecto2,
              Total / ( SELECT SUM(Total) FROM CTE2 ) Percentage
       FROM     CTE2    
       UNION  ALL
       SELECT 'Porcentaje',
               <your two columns>
               '100'
       FROM   CTE

しかし、これは確かに非常に厄介です。可能であれば、データを返し、レポートツールで合計とパーセンテージの計算を行うのが最善の策です。

于 2012-04-16T19:32:30.397 に答える
0

これは私がしました:

Declare @Names As Varchar(Max), @strSQL Varchar(Max), @PercentNames varchar(max) ;
DECLARE @sum AS varchar(MAX);

Select @Names = Stuff((Select ',' + QuoteName(Proyecto)
From Proyectos2 Group By Proyecto Order by Proyecto For XML Path('')), 1, 1, '');

Select @PercentNames = Stuff((Select ',' + 'CAST(' + QuoteName(Proyecto)  + '* 100.0/Total AS DECIMAL(10,2))'
From Proyectos2 Group By Proyecto Order by Proyecto For XML Path('')), 1, 1, '');
Select @sum = Stuff(
(
Select ', 1.0 * SUM(' + QuoteName(Proyecto) + ') as ' + QuoteName(Proyecto)
From Proyectos2 
Group By Proyecto 
Order by Proyecto For XML Path('')
), 1, 1, '') + ', SUM(Total) as Total';

Set @strSQL = 'select case when grouping(Vendedora) = 1 then ''Grand Total'' else Vendedora end as Vendedora, ' + @sum + N'
from (
Select Vendedora, ' + @Names +  ', (' + REPLACE(@Names, '],[', '] + [') + ') as Total' + 
' From (Select Vendedora, Proyecto From Clientes2) as P 
 Pivot (Count(Proyecto) For Proyecto in (' + @Names + ')) As Pvt
) as S
group by
    Vendedora
    with rollup';

SET @strSQL = 'WITH CTE AS ( ' + @strSQL + ' ) 
              SELECT *, CAST(Total * 100.0 / (select Total from cte where Vendedora = ''Grand Total'') as Decimal(10,2)) as [Percent]

              FROM CTE UNION ALL 
              SELECT ''Porcentaje'', ' + @PercentNames + ', ''100'', 100' +
              '  FROM CTE ' +
              ' WHERE Vendedora = ''Grand Total'';';

print @strSQL;
Execute (@strSQL);
GO

正常に動作しています。

しかし、まだ問題があります。小数点以下の数値を削除したいのです。この場合、私は何ができますか?

于 2012-04-17T16:44:08.050 に答える