2011-04-06 235 views
0

我正在運行下面的腳本。我在想,如果有人知道如何三個附加行添加到結果:計算SQL中的最大值,最小值和平均值

1.增加一個新行MAX值

2.加一個新行的最小值。

3.添加平均值的新行。

這是我的查詢,它運行在2006年4月和5月的兩個整月數據上。

SELECT 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
SUM(ITEMS)        AS ITEM, 
'NUMBER'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 

該查詢將生成以下結果(部分),並在結果底部顯示所需的addtional行。

非常感謝, 喬

FY  DAY  STORE DATES  ITEM NOTE 
2006 Saturday ELEVEN 4/1/2006 14 NUMBER 
2006 Sunday  ELEVEN 4/2/2006 21 NUMBER 
2006 Monday  ELEVEN 4/3/2006 24 NUMBER 
-------------------------------------------------- 
-------------------------------------------------- 
-------------------------------------------------- 
2006 Monday  ELEVEN 5/29/2006 37 NUMBER 
2006 Tuesday  ELEVEN 5/30/2006 20 NUMBER 
2006 Wednesday ELEVEN 5/31/2006 25 NUMBER 
2006 Saturday ELEVEN 5/13/2006 5 MINIMUM 
2006 Tuesday  ELEVEN 5/16/2006 61 MAXIMUM 
2006    ELEVEN    25 AVERAGE 
+0

你可以發佈你的輸入數據集嗎? – 2011-04-06 18:25:37

+1

爲什麼你想要一個新的行這些值?連續顯示這些內容非常重要,應該由報告引擎處理。 – Thomas 2011-04-06 18:40:03

回答

2

建議你加載你的查詢到一個表變量第一。然後你可以執行你的元操作。然後將3行記錄到結果集上。

這種方法的好處:你是從同一個結果集計算

  • 。如果您複製/粘貼3(最小,最大,平均)的查詢,您可能會讀取不同的數據,如果有另一個流程在計算時更新了行。如果/發生這種情況,與結果集中的原始數據相比,您的計算似乎不正確。

  • 更少的代碼閱讀和維護

DECLARE @MyResults (TABLE) (FY int, DAY varchar(10), STORE varchar(10), DATES varchar(10), ITEM varchar(10), NOTE varchar(10)) 

DECLARE @MyCalcs TABLE (ForYear int, Item int, Note varchar(100)) 

--calc the avg, max and min 

INSERT INTO @MyCalcs (ForYear, Item, Note) 
    SELECT FY, AVG(ITEMS), 'Average' 
    FROM @MyResults GROUP BY FY 

INSERT INTO @MyCalcs (ForYear, Item, Note) 
    SELECT FY, Max(ITEMS), 'Max' 
    FROM @MyResults GROUP BY FY 

INSERT INTO @MyCalcs (ForYear, Item, Note) 
    SELECT FY, MIN(ITEMS), 'Min' 
    FROM @MyResults GROUP BY FY 

--union the discrete data with the calcs 
SELECT FY,DAY,STORE,DATES,ITEM,NOTE 
FROM @MyResults 
UNION ALL 
SELECT ForYear AS FY, '' AS Day, '' AS Store, Item, Note 
FROM @MyCalcs 
1
SELECT 0 as p, 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
SUM(ITEMS)        AS ITEM, 
'NUMBER'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 

union 

SELECT 1 as p, 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
min(ITEMS)        AS ITEM, 
'MINIMUM'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 
having items = min(items) 
limit 1 

union 

SELECT 2 as p, 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
max(ITEMS)        AS ITEM, 
'MAXIMUM'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 
having items = max(items) 
limit 1 

union 

SELECT 3 as p, 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
''          AS DAY, 
STORE_NAME        AS STORE, 
''          DATES, 
avg(ITEMS)        AS ITEM, 
'AVERAGE'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 

order by p 
+0

謝謝C,它的工作原理。 – joe 2011-04-07 00:46:48

1
  • 爲了使他們處於底部,你需要一個虛擬的排序列。
  • 要添加額外的行,您需要將多個結果UNION-ed結合在一起。
  • 要每組只有一行,您需要使用TOP,但每個UNION查詢只能使用一個TOP,因此您需要對它們進行子查詢。
  • 日期如'04/1/2006'容易出現錯誤的DATEFORMAT設置。使用YYYYMMDD,例如20060104獲得可靠結果

在事務(隔離級別快照)中執行此操作以查看UNION部件之間的一致結果。

SELECT FY, DAY, STORE, DATES, ITEM, NOTE 
FROM 
(
SELECT Sorter=1, 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
SUM(ITEMS)        AS ITEM, 
'NUMBER'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 
UNION ALL 
SELECT 2,* FROM (
SELECT TOP 1 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
SUM(ITEMS)        AS ITEM, 
'MAX'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 
ORDER BY ITEM DESC) X 
UNION ALL 
SELECT 3,* FROM (
SELECT TOP 1 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
SUM(ITEMS)        AS ITEM, 
'MIN'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE 
ORDER BY ITEM) X 
UNION ALL 
SELECT 4, FY, '', STORE, '', AVG(ITEM), NOTE 
FROM (
SELECT 
DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)) AS FY, 
DATENAME(WEEKDAY, SOLD_DATE)    AS DAY, 
STORE_NAME        AS STORE, 
CONVERT (VARCHAR, SOLD_DATE, 10)   DATES, 
SUM(ITEMS)        AS ITEM, 
'AVERAGE'         AS NOTE  
FROM MYTABLE 
WHERE SOLD_DATE >='04/1/2006' 
AND SOLD_DATE <'06/1/2006' 
AND STORE_NAME ='ELEVEN' 
GROUP BY DATEPART(YYYY, DATEADD(MM, 3, SOLD_DATE)), 
DATENAME(WEEKDAY, SOLD_DATE), STORE_NAME, SOLD_DATE) Y 
) X 
ORDER BY SORTER 
相關問題