簡體   English   中英

SQL:如何以行值作為列名顯示數據,然后計算每行值的 ID 次數?

[英]SQL: How to display data with row values as column names and then count number of times ID per row value?

這是我的數據庫和小提琴設置:

CREATE TABLE PRODUCTS (
    NAME varchar(20),
    PRODUCT_ID int(3)
);

CREATE TABLE PAYMENT (
    NAME varchar(20),
    PAYMENT_ID int(4)
);

INSERT INTO PRODUCTS (NAME, PRODUCT_ID)
VALUES
("Apple", 1), 
("Banana", 2), 
("Watermelon", 3),
("Bread", 4), 
("Milk", 5), 
("Cake", 6), 
("Candy", 7), 
("Butter", 8), 
("Carrot", 9),
("Tomato", 10);


INSERT INTO PAYMENT (NAME, PAYMENT_ID)
VALUES
("Banana", 85),
("Apple", 94),
("Banana", 94),
("Candy", 85),
("Banana", 105);

https://www.db-fiddle.com/f/5jsGYfWZ6pnzgf62Z5FA8L/0

我想我必須做一些計數(這里的 CASE 語句)。

我看到了一些關於樞軸的東西,但不確定?

是的,你是對的,這是一種可能性

當只有一種選擇時,我使用 IF。

SELECT 
    p.NAME
    ,SUM(IF(PAYMENT_ID = 85,1,0)) '85'
    ,SUM(IF(PAYMENT_ID = 94,1,0)) '94'
    ,SUM(IF(PAYMENT_ID = 105,1,0)) '105'
FROM PRODUCTS p LEFT JOIN PAYMENT pa ON p.NAME = pa.NAME
GROUP BY p.NAME;

兩個表之間的引用應該是 id 而不是名稱,名稱可能是唯一的,但數字需要的空間比文本少。

 CREATE TABLE PRODUCTS ( NAME varchar(20), PRODUCT_ID int(3) ); CREATE TABLE PAYMENT ( NAME varchar(20), PAYMENT_ID int(4) ); INSERT INTO PRODUCTS (NAME, PRODUCT_ID) VALUES ("Apple", 1), ("Banana", 2), ("Watermelon", 3), ("Bread", 4), ("Milk", 5), ("Cake", 6), ("Candy", 7), ("Butter", 8), ("Carrot", 9), ("Tomato", 10); INSERT INTO PAYMENT (NAME, PAYMENT_ID) VALUES ("Banana", 85), ("Apple", 94), ("Banana", 94), ("Candy", 85), ("Banana", 105);
\n \n\n \n\n \n\n \n
SELECT p.NAME ,SUM(IF(PAYMENT_ID = 85,1,0)) '85' ,SUM(IF(PAYMENT_ID = 94,1,0)) '94' ,SUM(IF(PAYMENT_ID = 105,1,0)) '105' FROM PRODUCTS p LEFT JOIN PAYMENT pa ON p.NAME = pa.NAME GROUP BY p.NAME;
\n姓名 |  85 |  94 |  105\n :--------- |  -: |  -: |  ——:\n蘋果 |  0 |  1 |  0\n香蕉 |  1 |  1 |  1\n面包 |  0 |  0 |  0\n黃油 |  0 |  0 |  0\n蛋糕 |  0 |  0 |  0\n糖果 |  1 |  0 |  0\n胡蘿卜 |  0 |  0 |  0\n牛奶 |  0 |  0 |  0\n番茄 |  0 |  0 |  0\n西瓜 |  0 |  0 |  0\n

db<> 在這里擺弄

MySQL有一個方便的快捷方式。 我建議:

SELECT p.NAME,
       SUM(pa.PAYMENT_ID = 85) as payment_85,
       SUM(pa.PAYMENT_ID = 94) as payment_94,
       SUM(pa.PAYMENT_ID = 105) as payment_105
FROM PRODUCTS p LEFT JOIN
     PAYMENT pa
     ON p.NAME = pa.NAME
GROUP BY p.NAME;

當然,如果你不關心沒有付款的產品,你只需要一張桌子:

SELECT pa.NAME,
       SUM(pa.PAYMENT_ID = 85) as payment_85,
       SUM(pa.PAYMENT_ID = 94) as payment_94,
       SUM(pa.PAYMENT_ID = 105) as payment_105
FROM PAYMENT pa
GROUP BY pa.NAME;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM