在一張表中,有來自不同供應商的不同類別的產品。如何列出每個供應商至少出現一次的類別中的產品?
例如:
select VendorName, count(*) as ItemsInElectronics
from product
where ProductCategorie = 'Electronics'
group by VendorName
| 供應商名稱 | ItemsInElectronics |
|---|---|
| 公司1 | 14 |
| 公司2 | 145 |
| 公司3 | 25 |
| 公司4 | 3 |
| 公司5 | 543 |
| 公司6 | 37 |
| 公司7 | 88 |
| 公司8 | 172 |
| 公司9 | 249 |
| 公司10 | 47 |
這是我當前的 SQL 陳述句,用于列出電子產品類別中的產品
SELECT TOP(16) VendorName, ProductTitle, ProductCategory
FROM [dbo].[Product]
WHERE ProductCategory = 'Electronics'
ORDER BY CHECKSUM(NEWID())
| 供應商名稱 | 產品名稱 | 產品分類 |
|---|---|---|
| 公司1 | 施陶布索格 | 電子產品 |
| 公司2 | 聯想 ThinkStation | 電子產品 |
| 公司3 | AMD 銳龍 7 5700G | 電子產品 |
| 公司2 | 數字貿易HS256 S3 | 電子產品 |
| 公司4 | Kaffeemaschine Delonghi | 電子產品 |
| 公司1 | NanoCell Fernseher LG | 電子產品 |
| 公司4 | H. Koenig Handstaubsauger | 電子產品 |
| 公司1 | W?schetrockner 糖果 8 公斤 | 電子產品 |
| 公司5 | Kühl-/Gefrierkombination, | 電子產品 |
| 公司6 | 華碩 ExpertBook B1500CEAE | 電子產品 |
| 公司7 | HP M01-F1507nz(英特爾酷睿 i5 | 電子產品 |
| 公司2 | 榮耀筆記本MagicBook 14 | 電子產品 |
| 公司2 | WD My Passport 1 TB 外部 | 電子產品 |
| 公司5 | Wasserkocher ?Inox 2822CH1? | 電子產品 |
| 公司1 | 智能手機 überholt 蘋果 | 電子產品 |
| 公司2 | 希捷 One Touch 便攜式 5 TB 電子產品 |
如何進行設定,以使每個供應商的至少一種產品可見?
uj5u.com熱心網友回復:
你可以做這樣的事情,但是如果有超過 16 個供應商,它不會考慮你想要做什么:
;WITH src AS
(
SELECT VendorName, ProductTitle, ProductCategory,
rn = ROW_NUMBER() OVER
(PARTITION BY VendorName ORDER BY CHECKSUM(NEWID()))
FROM dbo.Product
WHERE ProductCategory = 'Electronics'
)
-- make sure we get one row from each vendor:
SELECT VendorName, ProductTitle, ProductCategory
FROM src WHERE rn = 1
UNION ALL
-- then if we want 16 rows total, take random rows from remainder:
SELECT TOP (16-(SELECT COUNT(DISTINCT VendorName) FROM src))
VendorName, ProductTitle, ProductCategory
FROM src WHERE rn > 1;
- 示例db<>fiddle
如果TOP (16)超過 16 家供應商具有重要意義或您有不同的要求,則需要說明。(這是一種處理超過 16 個供應商的方法,但每個供應商仍然只能獲得一行。)
通過更新后的評論,您希望在供應商之間進行更均勻的分發,您可以稍微輕松地完成此操作。這將回傳來自每個供應商的隨機產品“塊”,在每個塊中隨機分配(因此您可能會看到來自公司 1、3、5、4、2,然后是 2、5、4、1、3 等的產品) :
DECLARE @top tinyint = 24;
;WITH src AS
(
SELECT VendorName, ProductTitle, ProductCategory,
rn = ROW_NUMBER() OVER
(PARTITION BY VendorName ORDER BY CHECKSUM(NEWID()))
FROM dbo.Product
WHERE ProductCategory = 'Electronics'
)
SELECT TOP (@top) VendorName, ProductTitle, ProductCategory
FROM src ORDER BY rn, NEWID();
雖然這將回傳盡可能均勻的整體分布,但更加隨機(因此您可能會看到來自公司 1、2、5、2、2、3、5、1、4 等的產品):
DECLARE @top tinyint = 24;
;WITH src AS
(
SELECT VendorName, ProductTitle, ProductCategory,
rn = ROW_NUMBER() OVER
(PARTITION BY VendorName ORDER BY CHECKSUM(NEWID()))
FROM dbo.Product
WHERE ProductCategory = 'Electronics'
)
SELECT * FROM (SELECT TOP (@top) VendorName, ProductTitle, ProductCategory
FROM src ORDER BY rn) x ORDER BY NEWID();
- 更新了 db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454765.html
上一篇:有沒有辦法找到在SQLServer中運行查詢的代碼行?
下一篇:簡化SELECT陳述句
