2

私は次のCTEを持っています。その目的は、一意の月/年のペアを提供することです。後のコードでは、CTEを使用して、月/年のペアの連結文字列リストを生成します。

;WITH tblStoredWillsInPeriod AS
(
    SELECT DISTINCT Kctc.GetMonthAndYearString(DateWillReceived) Month
    FROM Kctc.StoredWills
    WHERE DateWillReceived BETWEEN '2010/01/01' AND '2010/03/31'
    ORDER BY DateWillReceived
)

些細なことなので、GetMonthAndYearString関数の実装は省略しました。

編集:マーティンによって要求されたように、ここに周囲のコードがあります:

DECLARE @PivotColumnHeaders nvarchar(MAX)
--CTE declaration as above---
SELECT @PivotColumnHeaders =
  COALESCE(
    @PivotColumnHeaders + ',[' + Month + ']',
    '[' + Month + ']'
  )
FROM tblStoredWillsInPeriod
SELECT @PivotColumnHeaders

悲しいことに、T-SQLは常に一歩先を行っているようです。このコードを実行すると、TOP(またはFOR XMLなど)も使用しない限り、CTEでORDER BYを使用できないことが示されます。TOPを使用すると、使用できないことが示されます。 DISTINCTを使用します。はい、T-SQLにはすべての答えがあります。

誰かが私の手首を単に切るよりも速いこの問題の解決策を考えることができますか?失血による死亡は驚くほど長引く可能性があることを理解しており、期限があります。

ご協力いただきありがとうございます。

デビッド

4

5 に答える 5

1

これは機能しますか?

DECLARE @PivotColumnHeaders VARCHAR(MAX)

;WITH StoredWills AS
(
SELECT GETDATE() AS DateWillReceived
UNION ALL
SELECT '2010-03-14 11:48:07.580'
UNION ALL
SELECT '2010-03-12 11:48:07.580'
UNION ALL
SELECT '2010-02-12 11:48:07.580'
),
tblStoredWillsInPeriod AS
(
    SELECT DISTINCT STUFF(RIGHT(convert(VARCHAR, DateWillReceived, 106),8), 4, 1, '-') AS  MMMYYYY, 
    DatePart(Year,DateWillReceived) AS  Year,
    DatePart(Month,DateWillReceived) AS  Month
    FROM StoredWills
    WHERE DateWillReceived BETWEEN '2010-01-01' AND '2010-03-31'
)


SELECT @PivotColumnHeaders =
  COALESCE(
    @PivotColumnHeaders + ',[' + MMMYYYY + ']',
    '[' + MMMYYYY + ']'
  )
FROM tblStoredWillsInPeriod
ORDER BY Year, Month
于 2010-06-14T14:17:47.580 に答える
0
SELECT DISTINCT TOP 100 PERCENT ...
ORDER BY ...
于 2010-06-14T11:19:17.243 に答える
0

CTE のデータを注文する必要がある理由を明確にしていただけますか? また、CTE を使用してクエリ内のデータを並べ替えることができないのはなぜですか。通常のサブクエリのデータも順序付けできないことに注意してください。

于 2010-06-14T10:35:16.993 に答える
0

そして、あなたは T-SQL 構文を知っていると思います!

TOP と DISTINCT を一緒に使用できないことについて、私は間違っていたことがわかりました。

これにより、構文エラーが発生します...

SELECT TOP 100 PERCENT DISTINCT...

これは絶対に問題ありませんが...

SELECT DISTINCT TOP 100 PERCENT...

それを解決してください。

欠点の 1 つは、SELECT リストに ORDER BY フィールドを含める必要があることです。これは、予想される DISTINCT の結果を妨げる可能性があります。T-SQL では、輪になって走り回ることがあります。

しかし、今のところ、私の手首は無印のままです。

于 2010-06-14T13:08:44.510 に答える
0

どうですか?

;WITH tblStoredWillsInPeriod AS 
( 
    SELECT DISTINCT Kctc.GetMonthAndYearString(DateWillReceived) Month 
    FROM Kctc.StoredWills 
    WHERE DateWillReceived BETWEEN '2010/01/01' AND '2010/03/31' 
    ORDER BY DateWillReceived 
),
tblStoredWillsInPeriodOrdered AS
(
    SELECT TOP 100 PERCENT Month 
    FROM tblStoredWillsInPeriod 
    ORDER BY Month
)
于 2010-06-14T10:42:16.857 に答える