nên basicially có 1 câu hỏi và 1 vấn đề:SQL sử dụng CASE trong SELECT bằng GROUP BY. Cần CASE-giá trị nhưng nhận hàng có giá trị
1. Câu hỏi - khi tôi có như 100 cột trong một bảng (và không có chìa khóa hoặc uindex được thiết lập) và Tôi muốn tham gia hoặc bỏ chọn bảng đó với chính nó, tôi có thực sự phải viết ra mỗi tên cột?
2. vấn đề - ví dụ dưới đây cho thấy 1. câu hỏi và vấn đề SQL tuyên bố thực tế của tôi
Ví dụ:
A.FIELD1,
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2
FROM TABLE A
GROUP BY A.FIELD1
Câu chuyện là: nếu tôi không đặt TRƯỜNG HỢP vào tuyên bố chọn riêng của nó sau đó tôi phải đặt các rowname thực tế vào GROUP BY và GROUP BY không nhóm NULL-giá trị từ CASE nhưng giá trị thực tế từ hàng. Và do đó tôi sẽ phải tham gia hoặc bỏ chọn với tất cả các cột, vì không có khóa và không có uindex, hoặc bằng cách nào đó tìm thấy một giải pháp khác.
DBServer là DB2.
Vì vậy, bây giờ để mô tả nó chỉ bằng các từ và không có SQL: Tôi có "mục đơn hàng" có thể được chia thành "ZD" và "EK" (1 = ZD, 2 = EK) và có thể được nhóm lại theo " nhà phân phối". Mặc dù "các mục đặt hàng" có thể có một trong hai "lần khởi hành" khác nhau (ZD, EK), các trường/hàng cho "ZD" và "EK" luôn được điền đầy. Tôi cần các nhóm để xem xét các "khởi hành" và chỉ khi được chỉ định "khởi hành" (ZD hoặc EK) đang thay đổi, sau đó tôi muốn một nhóm mới được tạo ra.
SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
ZD
EK
TABLE.DISTRIBUTOR
TABLE.DEPARTEMENT
Điều này ở đây hoạt động trong SELECT và ZD, EK trong GROUP BY. Chỉ có vấn đề là, ngay cả khi EK không phải là DEPARTEMENT được chỉ định, nó vẫn mở một nhóm mới nếu nó thay đổi, bởi vì anh ta đang sử dụng giá trị EK thực và không phải là NULL từ CASE, như tôi đã giải thích hàng đầu.
Bạn có nghĩa là kiểm tra giá trị của mỗi cột của bảng A đến cột trong bảng b với cùng tên cột và tất cả các cột phải khớp nhau? Hay bạn có nghĩa là một số loại logic khác? – WarrenT
Chính xác, nhưng đó chỉ là câu hỏi mặc dù và không phải là vấn đề thực sự, mà tôi sẽ cố gắng để giải thích thêm/tốt hơn trong thời gian gần. – Khazar