輸入
| 水果 | 季節 | 價錢 |
|---|---|---|
| 蘋果 | 春天 | 15 |
| 蘋果 | 夏天 | 20 |
| 蘋果 | 秋天 | 35 |
| 蘋果 | 冬天 | 55 |
| 香蕉 | 春天 | 13 |
| 香蕉 | 夏天 | 2 |
| 香蕉 | 秋天 | 3 |
| 香蕉 | 冬天 | 5 |
| 桃子 | 春天 | 40 |
| 桃子 | 夏天 | 50 |
| 桃子 | 秋天 | 33 |
| 桃子 | 冬天 | 44 |
這是創建表MYSQL(我不擅長mssql)
CREATE TABLE Question(
fruit varchar(10),
season varchar(10),
price numeric
);
INSERT INTO
Question
VALUES
('apple', 'spring', 15),
('apple', 'summer', 20),
('apple', 'autumn', 35),
('apple', 'winter', 55),
('banana', 'spring', 13),
('banana', 'summer', 2),
('banana', 'autumn', 3),
('banana', 'winter', 5),
('peach', 'spring', 40),
('peach', 'summer', 50),
('peach', 'autumn', 33),
('peach', 'winter', 44);
因為我的完整資料有300多種水果,所以不能在sql查詢中使用apple、banana等,也不能在sql查詢中使用spring、summer等。
如果有任何關于這個組合的簡單解決方案?
輸出期望
| 水果 | spring_price | 夏季價格 | 秋季價格 | 冬季價格 |
|---|---|---|---|---|
| 蘋果 | 15 | 20 | 35 | 55 |
| 香蕉 | 13 | 2 | 3 | 5 |
| 桃子 | 40 | 50 | 33 | 44 |
uj5u.com熱心網友回復:
這是使用條件聚合的基本方法,無需旋轉:
select fruit, SUM(CASE WHEN season = 'spring' then price else 0 END) SpringPrice,
SUM(CASE WHEN season = 'autumn' then price else 0 END) AutumnPrice,
SUM(CASE WHEN season = 'winter' then price else 0 END) WinterPrice,
SUM(CASE WHEN season = 'summer' then price else 0 END) SummerPrice
from Question
group by fruit
uj5u.com熱心網友回復:
即使您不知道任何水果名稱,也很容易為每個水果獲得一行:
SELECT * FROM dbo.Question
PIVOT (MAX(price) FOR season IN
([spring],[summer],[autumn],[winter])
) AS p;
如果您事先不了解它們,則很難獲得季節專欄(請參閱此處的一些想法)。
uj5u.com熱心網友回復:
如下使用樞軸
SELECT *
FROM (
SELECT
fruit
, CONCAT(season, '_price') AS Col
, price
FROM Question
) Src
PIVOT (
MAX(price)
FOR Col IN (
[spring_price], [summer_price],
[autumn_price], [winter_price]
)
) Pvt
ORDER BY fruit;
uj5u.com熱心網友回復:
SQL 語言對您在查看任何資料之前在查詢編譯時了解結果中的列有非常嚴格的要求。如果您必須查看資料以找出您想要的列,那么您將被困在使用(潛在危險的)動態 SQL 中,需要三個步驟:
- 運行查詢以查找有關所需列的資訊。
- 使用第 1 步的結果動態構建新的 SQL 陳述句。
- 運行步驟 2 中的 SQL。
在這種情況下,我們看到spring、summer、autumn和winter,它們是可以避免此問題的固定值。但我們也看到了這一點:
不能在 sql 查詢中使用 spring、summer 等。
那是個問題。它使您回到動態 SQL 領域,因為您在查詢完成編譯之前再次查看資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446741.html
