2009-12-14 134 views
0

T-SQL查詢支點假如你有這個表:組合兩個在一個

CREATE TABLE Records 
(
    RecordId  int IDENTITY(1,1) NOT NULL, 
    CreateDate  datetime   NOT NULL, 
    IsSpecial  bit    NOT NULL 
    CONSTRAINT PK_Records PRIMARY KEY(RecordId) 
) 

現在的報告需要創建其中總記錄和全部特別記錄按月細分。我可以單獨使用這兩個查詢:

--  TOTAL RECORDS PER MONTH 
SELECT January, February, March, April, May, June, 
    July, August, September, October, November, December 
FROM (
    SELECT RecordId, DATENAME(MONTH, CreateDate) AS RecordMonth 
    FROM dbo.Records 
) AS SourceTable 
PIVOT (
    COUNT(RecordId) FOR RecordMonth IN (January, February, March, April, May, June, 
    July, August, September, October, November, December) 
) AS PivotTable; 

--  TOTAL SPECIAL RECORDS PER MONTH 
SELECT January, February, March, April, May, June, 
    July, August, September, October, November, December 
FROM (
    SELECT RecordId, DATENAME(MONTH, CreateDate) AS RecordMonth 
    FROM dbo.Records 
    WHERE IsSpecial = 1 
) AS SourceTable 
PIVOT (
    COUNT(RecordId) FOR RecordMonth IN (January, February, March, April, May, June, 
    July, August, September, October, November, December) 
) AS PivotTable; 

結果可能是這樣的:

    Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec 
total    0  0 2  2  1  0  0 1  2  1  2 4 
total special  0  0 1  0  1  0  0 0  0  0  0 2 

是否有可能這兩個查詢合併成一個更高效的查詢?

+0

結合如何?你能給出一個結果集的例子嗎? – JeffO 2009-12-14 20:23:12

回答

3

我會做這樣的:

SELECT 
    CASE SQ.total_type 
      WHEN 1 THEN 'total special' 
      WHEN 2 THEN 'total expensive' 
      ELSE 'total' 
    END AS total_type, 
    SUM(CASE WHEN MONTH(R.CreateDate) = 1 THEN 1 ELSE 0 END) AS January, 
    SUM(CASE WHEN MONTH(R.CreateDate) = 2 THEN 1 ELSE 0 END) AS February, 
    SUM(CASE WHEN MONTH(R.CreateDate) = 3 THEN 1 ELSE 0 END) AS March, 
    ... 
FROM 
    dbo.Records R 
INNER JOIN 
    (
      SELECT 0 AS total_type UNION ALL -- All 
      SELECT 1 UNION ALL     -- IsSpecial 
      SELECT 2       -- IsExpensive 
    ) AS SQ ON 
    (R.IsSpecial | (R.IsExpensive * 2)) & SQ.total_type = SQ.total_type 
GROUP BY 
    SQ.total_type 
ORDER BY 
    SQ.total_type DESC 
+0

好點。不要使用PIVOT ... – gbn 2009-12-14 20:27:06

+0

我的查詢是錯誤的atm雖然...正在修復 – 2009-12-14 20:30:04

+0

好吧,我認爲它現在正常工作 – 2009-12-14 20:33:38

2

只能有每一個支點合計(COUNT(RecordId)),所以你要做的就是結合成一個結果集與UNION ALL用合適的額外的列來識別每個樞軸。

否則,你就沒有辦法區分兩種不同的聚集在樞軸

+0

我喜歡用Common Table Express來做到這一點。 – 2009-12-14 20:27:48

0

感謝湯姆的解決方案,即回答我的問題支點。

對我來說太糟糕了我錯了。對於我的問題,我現在的感覺會更好用普通的分組這樣的查詢,而不是:

SELECT DATENAME(MONTH, CreateDate) AS Month, 
    COUNT(*) AS Total, 
    SUM(CASE 
     WHEN IsSpecial = 1 THEN 1 
     ELSE 0 
    END) AS TotalSpecial, 
    SUM(CASE 
     WHEN IsExpensive = 1 THEN 1 
     ELSE 0 
    END) AS TotalExpensive 
FROM Records 
GROUP BY DATENAME(MONTH, CreateDate); 

然後所有剩下要做的就是它們出現之前轉動的結果。很高興知道呃?