0

SQL 2008を使用して、私はこのコードを持っています:

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

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,'')

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

これは 戻る

私が欲しいのは、これらのいずれかがあれば:

SET @showstore = 1
SET @showcashier = 1
SET @showregister = 1
SET @showdate = 1

0の場合、結果ウィンドウに表示したくありません。したがって、@ showcashierが0の場合、キャッシャーは表示されません

4

2 に答える 2

2

通常の SQL ではできません。SQL ステートメントによって返される列が定義されています。

3 つの選択肢があります。1 つ目は、アプリケーション レベルで列を選択することです。2 つ目は、NULL 値を返すことです (これは、構文が正しい場合にクエリが行うことです。3 つ目は、「動的な」SQL を使用することです。つまり、SQL クエリを文字列として生成し、それを実行します。

3 番目のオプションは、使用しているデータベースによって異なります。

于 2013-02-04T21:08:45.857 に答える
1

これを行う1つの方法は、次のようなストアドプロシージャを使用することです。

CREATE PROCEDURE GetData
    @show tinyint
AS
BEGIN
    IF @show = 1
    BEGIN
        select CurrencyDesc, POSCurrency from Currencies;
    END
    ELSE
        select CurrencyDesc from Currencies;
END 

そして、次のように実行します。

exec GetData 1 -- returns 2 columns

exec GetData 0 -- returns one column
于 2013-02-04T21:27:38.330 に答える