0

このコードは、ピボットされた複数のテーブルからの情報を表示するようになりました。これで、このコードはほぼ希望どおりに機能するようになりました(現在、何かに取り組んでいます。これ以上の質問はありません)。

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, '+@colsNull+' 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('+@cols+')) piv'
execute(@query)

select * from ##tempz
4

1 に答える 1

2

使用しているRDBMSを指定していませんが、以前の質問に基づいてSQLServerを想定しています。限られた詳細に基づいて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, '+@cols+'
       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('+@cols+')
       ) 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, '+@colsNull+'
                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 = '''+@cashiername+''' 
                ) p
                pivot
                (
                    sum(amount) 
                    for CurrencyDesc in('+@cols+')
                ) piv'

execute(@query)

SQL FiddlewithDemoを参照してください

于 2013-02-04T17:51:05.203 に答える