2013-02-04 39 views
0

此代码现在显示来自多个表的信息,这些表都是支持的 好的,所以现在这个代码几乎可以像我想要的那样工作了(目前正在使用它,没有更多的问题atm ):将多个表连接到数据透视表的动态表中

if (exists (select * from tempdb.INFORMATION_SCHEMA.TABLES where TABLE_NAME = '##tempz')) 
begin 
drop table ##tempz 
end 
else 
DECLARE @startDate datetime 
DECLARE @enddate datetime 
DECLARE @registernum int 
DECLARE @storename varchar(20) 
DECLARE @cashiername varchar(20) 
SET @startDate = '1/1/2011' 
SET @enddate = '1/1/2013' 
SET @registernum = 01 
SET @storename = '01' 
SET @cashiername = 'admin' 

DECLARE @cols AS NVARCHAR(MAX),@colsNull AS NVARCHAR(MAX),@query AS NVARCHAR(MAX) 
SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(c.CurrencyDesc) 
FROM rpPay p LEFT JOIN RPTrs r ON p.ReceiptNo = r.ReceiptNo LEFT JOIN Currencies c ON c.POSCurrency = LEFT(p.paytype,1) 
WHERE r.trsdate >= @startDate AND r.trsdate <= @enddate 
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SELECT @colsNull = STUFF((SELECT DISTINCT ', IsNull(' + QUOTENAME(c.CurrencyDesc) +', 0) as '+ QUOTENAME(c.CurrencyDesc) 
FROM rpPay p LEFT JOIN RPTrs r ON p.ReceiptNo = r.ReceiptNo LEFT JOIN Currencies c ON LEFT(p.paytype,1) = c.POSCurrency 
WHERE r.trsdate >= @startDate AND r.trsdate <= @enddate 
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

--select @cols, @colsnull 

SET @query = 'select date, cashregister, storeid, cashier, '[email protected]+' into ##tempz 
FROM 
(SELECT cast(r.trsdate AS DATE) date,c.CurrencyDesc,p.amount,r.cashregister,r.storeid,r.cashier 
FROM rpPay p LEFT JOIN RPTrs r ON p.ReceiptNo = r.receiptno LEFT JOIN Currencies c ON LEFT(p.paytype,1) = c.POSCurrency 
WHERE r.trsdate >= '''+ convert(varchar(10), @startDate, 101) +''' AND r.trsdate <= '''+ convert(varchar(10), @endDate, 101) +''' 
) p 
pivot 
(sum(amount) FOR CurrencyDesc in('[email protected]+')) piv' 
execute(@query) 

select * from ##tempz 
+1

让我们从你正在使用的RDBMS开始 – Lamak

+1

发布你的全表结构会非常有帮助 – Taryn

+0

MsSQL 2008,rpPay有storeID,PayType,金额。货币具有POSCurrency(与rpPay.PayType相同)CurrencyDesc。 RPTrs有storeID,trsdate – JohnZ

回答

2

您没有指定您所使用的RDBMS但我SQL服务器根据你前面的问题假设。根据有限的细节,你可以得到PIVOT的数据。

如果你提前知道时间的价值,那么你可以硬编码使用静态支点的值:

select * 
from 
(
    select 
     cast(r.trsdate as DATE) date, 
     c.CurrencyDesc, 
     p.amount 
    from rpPay p 
    left join RPTrs r 
     on p.id = r.id 
    left join Currencies c 
     on p.PayType = c.PayType 
    where r.trsdate >= @startDate 
     and r.trsdate <= @enddate 
) src 
pivot 
(
    sum(amount) 
    for CurrencyDesc in (Amex, Cash, Visa, Check, [Gift Card]) 
) piv 

如果值是未知的,那么你可以使用动态SQL:

declare @startDate datetime 
declare @enddate datetime 
    set @startDate = '1/1/12' 
set @enddate = '1/1/13' 
DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(c.CurrencyDesc) 
        from rpPay p 
        left join RPTrs r 
         on p.id = r.id 
        left join Currencies c 
         on p.PayType = c.PayType 
        where r.trsdate >= @startDate 
         and r.trsdate <= @enddate 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query 
    = 'select date, '[email protected]+' 
     from 
     (
     select 
      cast(r.trsdate as DATE) date, 
      c.CurrencyDesc, 
      p.amount 
     from rpPay p 
     left join RPTrs r 
      on p.id = r.id 
     left join Currencies c 
      on p.PayType = c.PayType 
     where r.trsdate >= '''+ convert(varchar(10), @startDate, 101) +''' 
      and r.trsdate <= '''+ convert(varchar(10), @endDate, 101) +''' 
     ) p 
     pivot 
     (
      sum(amount) 
      for CurrencyDesc in('[email protected]+') 
     ) piv' 

execute(@query) 

编辑#1,根据你的编辑问题,你可以使用:

declare @startDate datetime 
declare @enddate datetime 
declare @registernum int 
declare @storename int 
declare @cashiername varchar(20) 
set @startDate = '1/1/2012' 
set @enddate = '1/1/2013' 
set @registernum = 01 
set @storename = '01' 
set @cashiername = 'admin' 

DECLARE @cols AS NVARCHAR(MAX), 
    @colsNull AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(c.CurrencyDesc) 
         from rpPay p 
         left join RPTrs r 
          on p.ReceiptNo = r.ReceiptNo 
         left join Currencies c 
          on p.PayType = c.POSCurrency 
         where r.trsdate >= @startDate and r.trsdate <= @enddate 
          and cashregister = @registernum 
          and r.storeid = @storename 
          and cashier = @cashiername 
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

select @colsNull = STUFF((SELECT DISTINCT ', IsNull(' + QUOTENAME(c.CurrencyDesc) +', 0) as '+ QUOTENAME(c.CurrencyDesc) 
         from rpPay p 
         left join RPTrs r 
          on p.ReceiptNo = r.ReceiptNo 
         left join Currencies c 
          on p.PayType = c.POSCurrency 
         where r.trsdate >= @startDate and r.trsdate <= @enddate 
          and cashregister = @registernum 
          and r.storeid = @storename 
          and cashier = @cashiername 
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'') 

--select @cols, @colsnull 

set @query = 'select date, cashregister, storeid, cashier, '[email protected]+' 
       from 
       (
        select cast(r.trsdate as DATE) date, 
         c.CurrencyDesc, 
         p.amount, 
         r.cashregister, 
         r.storeid, 
         r.cashier 
        from rpPay p 
        left join RPTrs r 
         on p.ReceiptNo = r.receiptno 
        left join Currencies c 
         on p.PayType = c.POSCurrency 
        where r.trsdate >= '''+ convert(varchar(10), @startDate, 101) +''' 
         and r.trsdate <= '''+ convert(varchar(10), @endDate, 101) +''' 
         and cashregister = '''+cast(@registernum as varchar(10))+''' 
         and r.storeid = '''+cast(@storename as varchar(50))+''' 
         and r.cashier = '''[email protected]+''' 
       ) p 
       pivot 
       (
        sum(amount) 
        for CurrencyDesc in('[email protected]+') 
       ) piv' 

execute(@query) 

SQL Fiddle with Demo

+0

这不完全一样,但FWIW http://www.sqlfiddle.com/#!6/4dea4/4 –

+0

@JohnZ在你的更新后看到我的编辑OP – Taryn

+0

我得到这些错误:Msg 102,Level 15,State 1,Line 1 'Cash'附近语法不正确。 Msg 105,Level 15,State 1,Line 19 字符串' )p 枢轴 (在[Cash],[MasterCard],[Offline C.Card ],[C.Card],[Str Cr],[Visa/MC],[现金兑换],[礼品卡],[Amex]))。 – JohnZ