0

テーブルに特定のアイテムの行がいくつあるかを調べようとしています。たとえば、itemID 1 の次の例では、結果 5 が必要です (現在取得している 3 ではありません)。TransactionID を PARTITION BY 句に追加したいと思っていますが、クエリが TransactionID でグループ化されないため、メッセージ 8120 が返されます。そうであれば、その数を取得するのは簡単ですが、トランザクション レベルでグループ化したくありません。そのItemCountを正しく取得するにはどうすればよいですか? とても簡単なはずですが、頭をぶつけています。

DECLARE @t TABLE (TransactionID INT PRIMARY KEY IDENTITY, CustomerID INT, ItemID INT);

INSERT INTO @t (CustomerID, ItemID)
VALUES
    (1, 1),
    (2, 1),
    (3, 1),
    (4, 2),
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 4),
    (1, 1);

SELECT
    CustomerID,
    ItemID,
    Rows = COUNT(*),
    ItemRowCount = COUNT(*) OVER (PARTITION BY ItemID)
FROM
    @t
GROUP BY
    CustomerID,
    ItemID
ORDER BY
    ItemID,
    CustomerID;

編集:私は集計しすぎていたと思います。Sebastian Meine が私をトラックに乗せてくれました。彼の答えは正しいので、私はそれを受け入れました。ただし、このサブクエリは次の場合に機能します。

SELECT
    CustomerID,
    ItemID,
    Rows = COUNT(*),
    ItemRowCount = (SELECT COUNT(*) FROM @t x WHERE t.ItemID = x.ItemID)
FROM
    @t t
GROUP BY
    CustomerID,
    ItemID
ORDER BY
    ItemID,
    CustomerID;
4

4 に答える 4

0

CTEを使用するか、サブテーブルに結合できます(このように)

SELECT
    tbl.CustomerID,
    tbl.ItemID,
    Rows = COUNT(*),
    ItemRowCount
FROM tbl
JOIN (SELECT ItemID, Count(*) as ItemRowCount
     FROM tbl
     GROUP BY ItemID) t ON tbl.ItemID = t.ItemID
GROUP BY
    tbl.CustomerID,
    tbl.ItemID,
    ItemRowCount
ORDER BY
    tbl.ItemID,
    CustomerID;

またはこれ

SELECT
    tbl.CustomerID,
    tbl.ItemID,
    Rows = COUNT(*),
    MAX(ItemRowCount)
FROM tbl
JOIN (SELECT ItemID, Count(*) as ItemRowCount
     FROM tbl
     GROUP BY ItemID) t ON tbl.ItemID = t.ItemID
GROUP BY
    tbl.CustomerID,
    tbl.ItemID
ORDER BY
    tbl.ItemID,
    CustomerID;
于 2013-08-09T15:03:48.693 に答える
0

シンプルcountgroup by次のように使用できます。

SELECT
    ItemID,
    ItemRowCount = COUNT(1)
FROM
    @t
GROUP BY
    ItemID
ORDER BY
    ItemID

または、すべての行に合計行数と項目行数を添付する必要がある場合:

SELECT
    CustomerID,
    ItemID,
    Rows = COUNT(1) over (),
    ItemRowCount = COUNT(1) OVER (PARTITION BY ItemID)
FROM
    @t
ORDER BY
    ItemID,
    CustomerID;
于 2013-08-09T15:03:53.340 に答える
0

テーブルにある特定のアイテムの行数を調べるために、CustomerId は必要ない場合があります。次のクエリを使用します -

DECLARE @t TABLE (TransactionID INT PRIMARY KEY IDENTITY, CustomerID INT, ItemID INT);

INSERT INTO @t (CustomerID、ItemID)
値
    (1, 1),
    (2, 1),
    (3, 1),
    (4, 2),
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 4),
    (1,1);

; cte AS(
    SELECT itemId, ROW_NUMBER() OVER (PARTITION BY itemId ORDER BY itemId DESC) AS row_cnt FROM @t
)   

SELECT itemId, MAX(row_cnt) row_count FROM cte GROUP BY itemId

それは戻ってきます -

itemId 行数
1 5
2 2
3 1
4 1

また、customerId が必要な場合は、次のように使用します -

; cte AS(
    SELECT customerId, itemId, ROW_NUMBER() OVER (PARTITION BY itemId ORDER BY itemId DESC) AS row_cnt FROM @t
)   
SELECT customerId, itemId, MAX(row_cnt) item_count FROM cte GROUP BY CustomerID, itemId

それは戻ってきます -

customerId itemId item_count
1 1 5
2 1 2
3 1 3
2 2 1
4 2 2
3 3 1
4 4 1
于 2013-08-09T15:35:21.580 に答える