1

SQL Server が STDEV および STDEVP の集計関数であることは承知しています。ただし、私の特定のケースでは、テーブルにデータがありません。テーブルには、時間ごとの製品の在庫が表示されます。1 時間が足りない場合は、在庫が 0 だったことを意味します。たとえば、2012 年 1 月 1 日の製品「バナナ」の数の 1 日全体の標準偏差を計算したいとします。

ありがとう!

データ

+---------------------+-------------+--------------+
|         Date        | ProductName | ProductCount |
+---------------------+-------------+--------------+
| 2012-01-01 00:00:00 |    Banana   |    15000     |
| 2012-01-01 01:00:00 |    Banana   |    16000     |
| 2012-01-01 02:00:00 |    Banana   |    17000     |
| 2012-01-01 05:00:00 |    Banana   |    12000     |
| 2012-01-01 00:00:00 |    Apple    |     5000     |
| 2012-01-01 05:00:00 |    Apple    |     6000     |
+---------------------+-------------+--------------+

SQL

CREATE TABLE ProductInventory (
    [Date]  DATETIME,
    [ProductName] NVARCHAR(50),
    [ProductCount] INT
)

INSERT INTO ProductInventory VALUES ('2012-01-01 00:00:00', 'Banana', 15000)
INSERT INTO ProductInventory VALUES ('2012-01-01 01:00:00', 'Banana', 16000)
INSERT INTO ProductInventory VALUES ('2012-01-01 02:00:00', 'Banana', 17000)
INSERT INTO ProductInventory VALUES ('2012-01-01 05:00:00', 'Banana', 12000)
INSERT INTO ProductInventory VALUES ('2012-01-01 00:00:00', 'Apple', 5000)
INSERT INTO ProductInventory VALUES ('2012-01-01 05:00:00', 'Apple', 6000)
4

4 に答える 4

2

CTE 関数 (検索してみましょう) を使用して、1 から 24 までの時間を取得できます。

しかし、値が 0 から 23 の「時間表」を作成するのは簡単です。

時間フィールドを持つこの時間テーブルがあるとしましょう

select stdev(coalesce(pi.ProductCount, 0))
from hours h
left join ProductInventory pi on DATEPART(hh, pi.Date) = h.hour
where coalesce(pi.ProductName, 'Banana') = 'Banana'
and (pi.Date is null or (Convert(char(8), pi.Date, 112))='20120101')
于 2012-05-23T16:37:45.443 に答える
1
STDEV( isnull( ProductCount , 0 ) ) 
于 2012-05-23T16:28:04.147 に答える
1

時間のテーブルを作成LEFT JOINし、Products テーブルに追加します。

DECLARE @h TABLE(hr DATETIME);
DECLARE @StartTime DATETIME='1/1/2012 00:00:00';
DECLARE @EndTime DATETIME='1/1/2012 23:00:00';
DECLARE @HourCount INT = DATEDIFF(HOUR,@StartTime,@EndTime)+1;
DECLARE @Product VARCHAR(30) = 'Banana';

INSERT INTO @h
SELECT TOP(@HourCount) DATEADD(HOUR,ROW_NUMBER()OVER(ORDER BY message_id)-1,@StartTime)
FROM sys.messages;

SELECT [ProductName]=ISNULL([ProductName],@Product)
, sd=STDEV(ISNULL([ProductCount],0))
FROM @h h
LEFT JOIN ProductInventory i ON h.hr = i.[Date]
WHERE ISNULL([ProductName],@Product)=@Product
GROUP BY ISNULL([ProductName],@Product);

結果:

ProductName                                        sd
-------------------------------------------------- ----------------------
Banana                                             5763.45307123671
于 2012-05-23T17:09:35.200 に答える