我知道標題有點含糊,但我有一種情況,我正在撰寫的查詢使用CASE WHEN陳述句來識別前端選擇的類別。Purchased我正在查詢的表 ( ) 有一個名為 的列item。專案表當然有每個專案的唯一識別符號。已購買表中的專案列將顯示已購買專案的數量,但如果購買了多個專案,則這些數字相加。一個例子是:
ITEM TABLE
-------------
1 Item A
2 Item B
4 Item C
8 Item D
依此類推,最大專案唯一識別符號為 256 (1,2,4,8,16,32,64,128,256)。使用了加倍序列,以便Purchased表中的每個數字只能有一個可能的專案或與之關聯的專案組。
因此,在Purchased表中,如果專案列中有“3”,則專案 A 和專案 B 都已購買。如果只購買了一件商品,我可以CASE WHEN顯示購買的商品名稱,但是尋找一種撰寫查詢的方法,在該查詢中我指定每個數字等于商品名稱,然后查詢采用“3”然后CONCAT是與該數字匹配的專案。
否則,我將有一個很長的 Case When 陳述句,并且我將有數百個可能性。
希望這是有道理的。SQL 相對較新。先感謝您。
表開始
專案表

銷售表

我通常會執行:
CASE WHEN s.ItemsPurchased = 1 THEN 'Bike' WHEN s.ItemsPurchased = 2 THEN 'Helmet' .... END 為 ItemsPurchased,
問題是一個訂單中的多個專案以及結構內的許多許多可能性。
我希望最終結果看起來像這樣:

uj5u.com熱心網友回復:
如果我理解正確,您可以使用string_agg(SQL Server 2017 )執行以下操作
select s.CustomerId, i.ItemsPurchased
from Sales s
cross apply (
select String_Agg(i.ItemName,', ') ItemsPurchased
from Item i
where i.Id & s.Item != 0
)i
請參閱
uj5u.com熱心網友回復:
-- create a item table
CREATE TABLE item (
item_value integer NOT NULL,
item_name TEXT NOT NULL
);
-- insert some values into item table
INSERT INTO item
VALUES
(1, 'A'),
(2, 'B'),
(4, 'C'),
(8, 'D'),
(16, 'E'),
(32, 'F'),
(64, 'G'),
(128, 'H'),
(256, 'I');
-- create a purchase table
CREATE TABLE purchase (
item integer not null
);
-- insert some values into purchase table
-- you will be finding out the items correspond to each of these
INSERT INTO purchase
VALUES
(3),
(5),
(6),
(9),
(10),
(12),
(17),
(18),
(20);
-- your sql goes like this , i tested it on https://www.mycompiler.io/new/sql
select p.item, ref.first_item_name, ref.second_item_name
from purchase p
left join
(
select item, first_item_name, second_item_name
from (
select *, rank() over(partition by item order by first_item_name, second_item_name) r
from (
select i1.item_value i2.item_value as item, i1.item_name as first_item_name, i2.item_name as second_item_name
from item i1
left join
item i2
on 1 = 1
order by item
)
)
where r = 1
) ref
on p.item = ref.item
uj5u.com熱心網友回復:
我使用了這個測驗資料:
create table purchase(pid integer, items integer);
create table items(item integer, name varchar(12));
insert into purchase (pid, items) values (4711, 3);
insert into purchase (pid, items) values (4712, 13);
insert into items(item, name) values (1, 'Item A');
insert into items(item, name) values (2, 'Item B');
insert into items(item, name) values (4, 'Item C');
insert into items(item, name) values (8, 'Item D');
然后我可以做這樣的查詢:
select p.pid, string_agg(i.name, ', ')
from purchase p
inner join items i on p.items & i.item = i.item
group by p.pid;
您可以輕松地根據您的用例調整此示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430434.html
