3

请有人帮帮我..这是我的桌子

ACCT_NR   DEDNCODE  DEDN_ALPHA             AMOUNT AGING PAY_PERIOD TYPE
20110101401 159      MEM PLAN               16.00   0   012013       S
20110101401 557      PHILHEALTH             175.00  0   012013       S
20110101401 617      S G T I                6.00    0   012013       S
20110101401 634      PAGIBIG C              100.00  0   012013       S
20110101401 761      PSMBFI EP              445.02  0   012013       S
20110101401 762      PSMBFI BG              25.00   0   012013       S
20110101401 009      PSSLAI                 2000.00 0   012013       N
20110101401 350      W TAX                  786.80  0   012013       N
20110101401 551      AFPMBA ADDL            1054.90 0   012013       N
20110101401 768      PSMBFI EL              3277.78 7   012013       N

这是我实现这一目标的查询。

SELECT [ACCT_NR]
      ,[DEDNCODE]
      ,[DEDN_ALPHA]
      ,[AMOUNT]
      ,[AGING]
      ,[PAY_PERIOD]
      ,[TYPE]
  FROM [IFIS_EarnDeduction].[dbo].[NDEDUCTIONS2013] where ACCT_NR = '20110101401' and PAY_PERIOD = '012013'

我想要的结果是这个

MEMPLAN PHILHEALTH SGTI PAGIBIGC PSMBFIEP PSMBFIBG PSSLAI   WTAX   AFPMBAADDL PSMBFIEL
 16.00   175.00    6.00  100.00   445.02   25.00   200.00   786.80  1054.90    3277.78

我用这段代码来生成我想要的..

DECLARE @cols AS NVARCHAR(MAX),
    @acctnr NVARCHAR(MAX),
    @payperiod NVARCHAR(MAX),
    @payperiod2 NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);
    SET @acctnr = '20110101401';
    SET @payperiod = '012013';
    SET @payperiod2= '062013';

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.DEDN_ALPHA) 
                    from [IFIS_EarnDeduction].[dbo].[NDEDUCTIONS2013] p
                   where ACCT_NR = '20110101401' and PAY_PERIOD = '012013'
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT ' + @cols + ' from 
             (
                SELECT *
  FROM [IFIS_EarnDeduction].[dbo].[NDEDUCTIONS2013]
  where ACCT_NR = Cast((' + @acctnr + ') As nvarchar(30))
            ) x
            pivot 
            (
                min(amount)
                for DEDN_ALPHA in (' + @cols + ')
            ) p '

execute(@query)

但结果是这样..这么多空值,数据不在正确的位置

MEMPLAN PHILHEALTH SGTI PAGIBIGC PSMBFIEP PSMBFIBG PSSLAI   WTAX   AFPMBAADDL PSMBFIEL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    2000.00 NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    2000.00 NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    2000.00 NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    2000.00 NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    2000.00 NULL    NULL
NULL    16.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    16.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    16.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    16.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    16.00   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    786.80
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    786.80
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    786.80
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    786.80
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    786.80
1054.90 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
1054.90 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
1054.90 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
1054.90 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
1054.90 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    175.00  NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    175.00  NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    175.00  NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    175.00  NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    175.00  NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    6.00    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    6.00    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    6.00    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    6.00    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    6.00    NULL
NULL    NULL    100.00  NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    100.00  NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    100.00  NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    100.00  NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    100.00  NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    445.02  NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    445.02  NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    445.02  NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    445.02  NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    445.02  NULL    NULL    NULL
NULL    NULL    NULL    NULL    25.00   NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    25.00   NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    25.00   NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    25.00   NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    25.00   NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    3277.78 NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    3277.78 NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    3277.78 NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    3277.78 NULL    NULL    NULL    NULL

有人可以建议我如何实现我的目标吗?提前致谢..

4

2 回答 2

3

作为对Devart 答案的补充(这是正确的,尽管在我看来不完整),发生这种情况的原因是因为当你 时PIVOT,引擎使用源行集中的所有列。

考虑它的一种方法是,未使用的每一列PIVOT(聚合列和值列都被删除并替换为透视列)被隐式地赋予一个GROUP BY. 您的查询包含基于此分组使每一行唯一的列,例如DEDNCODETYPE。您已经有了正确的查询形式——源数据在派生表中x——但它的列太多了。因此,解决方案很简单,只需选择PIVOT. 对于您当前的查询,您不需要任何额外的列,因此您只需SELECT AMOUNT, DEDN_ALPHA FROM ...在派生表中选择所需的两个列。

您可以更改'SELECT ' + @cols + ' from ... ''SELECT * from ... '更清楚地查看您的查询出了什么问题。请注意,它PIVOT会替换FROM子句中它之前的所有表!您不能再处理以前表中的任何列 - 尝试使用它x.*,您会发现它p.*现在只存在。作为记录,您实际上可以继续JOIN添加其他表,甚至执行另一个表——PIVOT请记住,每个表都使用子句PIVOT中的所有先前表和别名,FROM从那时起就无法访问它们——您使用最新的PIVOT别名访问这些列。

于 2013-06-20T06:27:47.957 回答
3

您只需要更改此代码 -

SELECT *
FROM [IFIS_EarnDeduction].[dbo].[NDEDUCTIONS2013]

对此——

SELECT AMOUNT, DEDN_ALPHA
FROM [IFIS_EarnDeduction].[dbo].[NDEDUCTIONS2013]

或者试试这个 -

DDL:

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

CREATE TABLE #temp
(
       ACCT_NR VARCHAR(30)
     , DEDNCODE VARCHAR(30)
     , DEDN_ALPHA VARCHAR(12)
     , AMOUNT DECIMAL(10,2)
     , AGING INT
     , PAY_PERIOD CHAR(6)
     , [TYPE] CHAR(1)
)

INSERT INTO #temp (ACCT_NR, DEDNCODE, DEDN_ALPHA, AMOUNT, AGING, PAY_PERIOD, [TYPE])
VALUES 
     ('20110101401', '159', 'MEM PLAN', 16.00  , 0, '012013', 'S'),
     ('20110101401', '557', 'PHILHEALTH', 175.00 , 0, '012013', 'S'),
     ('20110101401', '617', 'S G T I', 6.00   , 0, '012013', 'S'),
     ('20110101401', '634', 'PAGIBIG C', 100.00 , 0, '012013', 'S'),
     ('20110101401', '761', 'PSMBFI EP', 445.02 , 0, '012013', 'S'),
     ('20110101401', '762', 'PSMBFI BG', 25.00  , 0, '012013', 'S'),
     ('20110101401', '009', 'PSSLAI', 2000.00, 0, '012013', 'N'),
     ('20110101401', '350', 'W TAX', 786.80 , 0, '012013', 'N'),
     ('20110101401', '551', 'AFPMBA ADDL', 1054.90, 0, '012013', 'N'),
     ('20110101401', '768', 'PSMBFI EL', 3277.78, 7, '012013', 'N')

询问:

DECLARE 
       @acctnr NVARCHAR(30)
     , @payperiod NVARCHAR(30)
     , @SQL NVARCHAR(MAX)

SELECT 
       @acctnr = '20110101401'
     , @payperiod = '012013'

SELECT @SQL = '
     SELECT *
     FROM (
          SELECT AMOUNT, DEDN_ALPHA
          FROM #temp
          WHERE ACCT_NR = CAST(' + @acctnr + ' AS NVARCHAR(30))
     ) x
     PIVOT (
          MIN(AMOUNT)
          FOR DEDN_ALPHA IN (' + cols + ')
     ) p'
FROM (
     SELECT cols = STUFF((
          SELECT ', [' + p.DEDN_ALPHA + ']' 
          FROM (
               SELECT DISTINCT 
                      p.DEDN_ALPHA
                    , rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
               FROM #temp p
               WHERE ACCT_NR = @acctnr
                    AND PAY_PERIOD = @payperiod
          ) p
          ORDER BY rn
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
) t

EXEC sys.sp_executesql @SQL

结果:

结果

于 2013-06-20T06:03:40.227 回答